填充日期维度 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
列的值应为 Weekday
、Weekend
或 Holiday
,如果 dayType 为 Holiday
,则应优先于 Weekend
或 Weekday
。
要有资格成为 Holiday
,日期必须是:
1月1日,
1月15日,
1月19日,
5月28日,
7月4日,
10月8日,
11 月 11 日,
11 月 22 日,
12 月 25 日。
有人要求我通过 PL/SQL 填充 saleDay
和 dayType
值,但我不知道从哪里开始或如何完成此操作。非常感谢任何 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_TERRITORY
是AMERICAN
,星期天是一周的第一天,在一些其他地区(例如欧洲国家)是第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中使用它,你可以在过程中执行查询。
我有以下 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
列的值应为 Weekday
、Weekend
或 Holiday
,如果 dayType 为 Holiday
,则应优先于 Weekend
或 Weekday
。
要有资格成为 Holiday
,日期必须是:
1月1日,
1月15日,
1月19日,
5月28日,
7月4日,
10月8日,
11 月 11 日,
11 月 22 日,
12 月 25 日。
有人要求我通过 PL/SQL 填充 saleDay
和 dayType
值,但我不知道从哪里开始或如何完成此操作。非常感谢任何 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_TERRITORY
是AMERICAN
,星期天是一周的第一天,在一些其他地区(例如欧洲国家)是第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中使用它,你可以在过程中执行查询。