如何从交易表TDate列提取信息构建含Month、Day、Year列的Calendar表?
嘿,这个需求在数据仓库建模里挺常见的,我来给你捋捋怎么实现——核心就是用SQL的日期函数把TDate拆成年、月、日,再把这些数据整理到Calendar表里。不同数据库的语法略有差异,我给你列几个主流数据库的实现方式:
第一步:创建Calendar表
首先得先建好Calendar表的结构,一般会加一个DateKey(比如用YYYYMMDD格式的整数,比如20130101)作为主键,方便后续和其他表关联:
MySQL/MariaDB版本
CREATE TABLE IF NOT EXISTS Calendar ( DateKey INT PRIMARY KEY, TDate DATE NOT NULL, Year INT NOT NULL, Month INT NOT NULL, Day INT NOT NULL );
SQL Server版本
CREATE TABLE Calendar ( DateKey INT PRIMARY KEY, TDate DATE NOT NULL, Year INT NOT NULL, Month INT NOT NULL, Day INT NOT NULL );
PostgreSQL版本
CREATE TABLE IF NOT EXISTS Calendar ( DateKey INT PRIMARY KEY, TDate DATE NOT NULL, Year INT NOT NULL, Month INT NOT NULL, Day INT NOT NULL );
第二步:从交易表提取并拆分日期数据
接下来从你的交易表中提取不重复的TDate值,拆分出年、月、日,插入到Calendar表里:
MySQL/MariaDB版本
INSERT INTO Calendar (DateKey, TDate, Year, Month, Day) SELECT DATE_FORMAT(TDate, '%Y%m%d') AS DateKey, TDate, YEAR(TDate) AS Year, MONTH(TDate) AS Month, DAY(TDate) AS Day FROM 你的交易表名 GROUP BY TDate; -- 确保每个日期只插入一次
SQL Server版本
INSERT INTO Calendar (DateKey, TDate, Year, Month, Day) SELECT CAST(FORMAT(TDate, 'yyyyMMdd') AS INT) AS DateKey, TDate, YEAR(TDate) AS Year, MONTH(TDate) AS Month, DAY(TDate) AS Day FROM 你的交易表名 GROUP BY TDate;
PostgreSQL版本
INSERT INTO Calendar (DateKey, TDate, Year, Month, Day) SELECT TO_CHAR(TDate, 'YYYYMMDD')::INT AS DateKey, TDate, EXTRACT(YEAR FROM TDate)::INT AS Year, EXTRACT(MONTH FROM TDate)::INT AS Month, EXTRACT(DAY FROM TDate)::INT AS Day FROM 你的交易表名 GROUP BY TDate;
额外提示
- 记得把代码里的
你的交易表名替换成实际的交易表名称哦。 - 如果需要更完善的Calendar表(比如星期几、季度、是否是周末/节假日),可以扩展字段,用对应的日期函数提取就行,比如MySQL里的
WEEKDAY()、SQL Server里的DATEPART(WEEKDAY, TDate)。 - 如果交易表中没有重复的TDate,也可以用
DISTINCT代替GROUP BY TDate,效果是一样的。
内容的提问来源于stack exchange,提问作者GammaRay
相关产品推荐
相关产品推荐

