代码之家  ›  专栏  ›  技术社区  ›  StevenC

通过PL/SQL填充日期维度表并确定日期类型

  •  0
  • StevenC  · 技术社区  · 7 年前

    我有以下SQL表:

    CREATE TABLE SALES
    (saleID         INT     PRIMARY KEY,
    grossSalePrice      DECIMAL(9,2),
    vehicleStatus       VARCHAR(10) NOT NULL CHECK (lower(vehicleStatus) IN ('available', 'sold', 'pending')),
    saleDate        DATE,
    saleMileage     INT,
    customerID      INT,
    salespersonID       INT,
    vehicleVIN      VARCHAR(25),
    CONSTRAINT SALES_FK1 FOREIGN KEY (customerID) REFERENCES CUSTOMERS(customerID),
    CONSTRAINT SALES_FK2 FOREIGN KEY (vehicleVIN) REFERENCES VEHICLES(vehicleVIN),
    CONSTRAINT SALES_FK3 FOREIGN KEY (salespersonID) REFERENCES SALESPERSONS(salespersonID));
    

    我创建了以下星形架构维度表:

    CREATE TABLE TIMES
    (saleDay        DATE        PRIMARY KEY,
    dayType         VARCHAR(50) NOT NULL);
    

    我需要填充 saleDay 的列 TIMES 表,每个 saleDate SALES 桌子此外 dayType 应根据每个 saleDay销售日 . 的值 日类型 列应为 Weekday , Weekend Holiday 如果dayType是 假日 它应该胜过 周末 周工作日 .

    有资格成为 假日 ,日期必须为: 1月1日, 1月15日, 1月19日, 5月28日, 7月4日, 10月8日, 11月11日, 11月22日, 12月25日。

    我被要求填充 saleDay销售日 日类型 通过PL/SQL获取值,但我不知道从何处开始,也不知道如何实现这一点。非常感谢您对我如何完成此任务的任何帮助/指导。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Dmitriy rajalaxmi    7 年前

    不需要使用PL/SQL。

    节假日使用以下内容:

    select '01.01' hd from dual union all
    select '15.01' from dual union all
    select '19.01' from dual union all
    select '28.05' from dual union all
    select '04.07' from dual union all
    select '08.10' from dual union all
    select '11.11' from dual union all
    select '22.11' from dual union all
    select '25.12' from dual
    

    要计算周末: to_char(saleDate, 'd') . 它返回一周中的若干天。但请注意,这取决于NLS设置。如果 NLS_TERRITORY 在设置中为 AMERICAN ,星期天是一周的第一天,在其他一些地区(例如欧洲国家)是第七天。

    因此,查询是:

    insert into times (saleDay, dayType)
    select saleDate, case when h.hd is not null then 'Holiday'
                          when to_char(saleDate, 'd') in (1,7) then 'Weekend' -- I suppose you are American
                          else 'Weekday' end dayType
       from sales s left join 
           (<holiday query above>) h
            on h.hd = to_char(s.saleDate, 'dd.mm')
    

    如果需要在PL/SQL中使用它,可以在过程中执行查询。

    推荐文章