转载地址:
https://blog.csdn.net/neweastsun/article/details/43866599
感谢大佬!
mysql中生成时间维度表
利用mysql常用日期函数生成时间维度表,效率最高,最简单,无需其他的一些工具支持。生成结果示例如下图:
复制下面的运行,就ok,和运行平常的sql语句一样!
-
# time span
-
-
SET @d0 =
"2012-01-01";
-
-
SET @d1 =
"2012-12-31";
-
-
-
-
SET @
date =
date_sub(@d0,
interval
1
day);
-
-
-
-
#
set up the
time
dimension
table
-
-
DROP
TABLE
IF
EXISTS time_dimension;
-
-
CREATE
TABLE
`time_dimension` (
-
-
`date`
date
DEFAULT
NULL,
-
-
`id`
int
NOT
NULL,
-
-
`y`
smallint
DEFAULT
NULL,
-
-
`m`
smallint
DEFAULT
NULL,
-
-
`d`
smallint
DEFAULT
NULL,
-
-
`yw`
smallint
DEFAULT
NULL,
-
-
`w`
smallint
DEFAULT
NULL,
-
-
`q`
smallint
DEFAULT
NULL,
-
-
`wd`
smallint
DEFAULT
NULL,
-
-
`m_name`
char(
10)
DEFAULT
NULL,
-
-
`wd_name`
char(
10)
DEFAULT
NULL,
-
-
PRIMARY
KEY (
`id`)
-
-
);
-
-
-
-
# populate the table with dates
-
-
INSERT
INTO time_dimension
-
-
SELECT @
date :=
date_add(@
date,
interval
1
day)
as
date,
-
-
#
integer
ID that allowsimmediate understanding
-
-
date_format(@
date,
"%Y%m%d")
as
id,
-
-
year(@
date)
as y,
-
-
month(@
date)
as m,
-
-
day(@
date)
as d,
-
-
date_format(@
date,
"%x")
as yw,
-
-
week(@
date,
3)
as w,
-
-
quarter(@
date)
as q,
-
-
weekday(@
date)+
1
as wd,
-
-
monthname(@
date)
as m_name,
-
-
dayname(@
date)
as wd_name
-
-
FROM T
-
-
WHERE
date_add(@
date,
interval
1
day) <= @d1
-
-
ORDER
BY
date
-
-
;
神秘的表T,仅仅需要有多于你需要生成日期的记录数即可。思路是从T表选择多行数据,同时生成对应的日期字段。
这里对转载的解释一下:表T可以是任意表,只要记录数比你要生成的天数多就可以了。比如上面的2012-01-01到2012-12-31,只要记录数大于366条就可以!!