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

Populate Date Dimension Table and Determine Day Type via PL/SQL

我有以下 SQL Table:

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));

并且我创建了以下星型模式维度 Table:

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

我需要用 SALES table 中的每个 saleDate 填充 TIMES table 的 saleDay 列。此外,dayType 栏应根据每个 saleDay 完成。 dayType 列的值应为 WeekdayWeekendHoliday,如果 dayType 为 Holiday,则应优先于 WeekendWeekday

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

有人要求我通过 PL/SQL 填充 saleDaydayType 值,但我不知道从哪里开始或如何完成此操作。非常感谢任何 help/guidance 关于我如何完成它。

不需要使用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')。它 returns 一周中的几天。但这里要小心,这取决于 NLS 设置。如果设置中的NLS_TERRITORYAMERICAN,星期天是一周的第一天,在一些其他地区(例如欧洲国家)是第7天。

所以查询是:

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中使用它,你可以在过程中执行查询。