这个页面有一种非常简洁的方式来生成一个健壮的日历表。我已经复制粘贴在下面:
CREATE TABLE calendar_table (
dt DATE NOT NULL PRIMARY KEY,
y SMALLINT NULL,
q tinyint NULL,
m tinyint NULL,
d tinyint NULL,
dw tinyint NULL,
monthName VARCHAR(9) NULL,
dayName VARCHAR(9) NULL,
w tinyint NULL,
isWeekday BINARY(1) NULL,
isHoliday BINARY(1) NULL,
holidayDescr VARCHAR(32) NULL,
isPayday BINARY(1) NULL
);
CREATE TABLE ints ( i tinyint );
INSERT INTO ints VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
INSERT INTO calendar_table (dt)
SELECT DATE('2010-01-01') + INTERVAL a.i*10000 + b.i*1000 + c.i*100 + d.i*10 + e.i DAY
FROM ints a JOIN ints b JOIN ints c JOIN ints d JOIN ints e
WHERE (a.i*10000 + b.i*1000 + c.i*100 + d.i*10 + e.i) <= 11322
ORDER BY 1;
我不明白最后一个查询中发生了什么。有人可以逐步向我解释吗?
我不知道您在解释中想要什么,但查询的最后一部分
Cartesian join
使用名为 的数字表进行交叉连接 ( ) 以生成从 0 到 11322 的有序数字序列ints
。然后查询将这些数字添加到日期“2010-01-01”作为日期间隔,从而生成等等,直到您添加 11322 天,即
'2040-12-31'
. 然后将这些日期插入dt
到calendar_table
.嗯,这是创建日期维度表的常用方法。插入日期后,您可以更新其余字段。您通常希望创建组织的假期表和发薪日逻辑或发薪日表来更新假期和发薪日字段。其余字段可以使用具有如下日期函数的查询进行更新。
干杯。