MySQL 8 0 11 生成日曆表

2021-08-21 17:57:21 字數 3235 閱讀 7664

mysql的date 資料類支援的時間範圍是 1000-1-1 到9999-12-31,通過計算可以知道最大支援天數為3287181天屬於百萬級別的。

mysql> select datediff('9999-12-31','1000-01-01') days;

+---------+

| days |

+---------+

| 3287181 |

+---------+

1 row in set (0.28 sec)

為了生產百萬資料的日曆,我們可以使用如下**生成日曆,當然在實際應用中可能只需要上千或者萬條記錄就夠了(10年也就是3650條資料記錄)。

建立乙個表儲存數字0到9,在建立乙個表儲存日期,然後通過新增字段擴充套件顯示。

create table if not exists num (i int);

insert into num (i) values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);

create table if not exists calendar(dateseq date);

--自2018-01-01開始生成100萬條日曆記錄:

insert into calendar(dateseq) select

adddate(

( -- 這裡的起始日期,你可以換成當前日期

date_format("2018-1-1", '%y-%m-%d')

),numlist.id

) as `date`

from

(select

n1.i + n10.i * 10 + n100.i * 100 + n1000.i * 1000+ n10000.i * 10000 +n100000.i*100000 as id

from

num n1

cross join num as n10

cross join num as n100

cross join num as n1000

cross join num as n10000

cross join num as n100000

) as numlist;

query ok, 1000000 rows affected (16.67 sec)

records: 1000000 duplicates: 0 warnings: 0

耗時16.67s即生成了100萬條日曆的記錄。

mysql> select min(dateseq),max(dateseq),count(1) from calendar;

+--------------+--------------+----------+

| min(dateseq) | max(dateseq) | count(1) |

+--------------+--------------+----------+

| 2018-01-01 | 4755-11-28 | 1000000 |

+--------------+--------------+----------+

1 row in set (1.02 sec)

有了上面的資料我們可以生成bi報表中經常需要的使用時間維度的表。

create table dim_calendar(

id bigint unsigned not null auto_increment primary key comment '自增主鍵',

dateseq date not null comment '日期序列,格式yyyy-mm-dd',

year_digital int not null comment '年份,2018',

quarter_digital tinyint comment '季度,1--4',

month_digital tinyint comment '月份,數字月份,1--12',

peroid_date int comment '日期,20180725',

peroid_month int comment '月份,201807',

period_week tinyint comment '一年的中的第幾周,1-53',

weekseq tinyint comment '週幾,1-7',

year_day int comment '一年中的第幾天,1--366',

month_day int comment '當月的第幾天 ,1-31'

)comment '日曆維度表';

利用上面的的日曆表可以生成時間維度表的資料:

--插入資料:

insert into dim_calendar(dateseq,year_digital,quarter_digital,month_digital,peroid_date,peroid_month,period_week,weekseq,year_day,month_day)

select

dateseq,year(dateseq),quarter(dateseq),month(dateseq),date_format(dateseq,'%y%m%d'),date_format(dateseq,'%y%m'),weekofyear(dateseq),dayofweek(dateseq)-1,dayofyear(dateseq),dayofmonth(dateseq)

from calendar;

--查詢驗證:

mysql> select * from dim_calendar where dateseq='2018-07-25'\g

*************************** 1. row ***************************

id: 206

dateseq: 2018-07-25

year_digital: 2018

quarter_digital: 3

month_digital: 7

peroid_date: 20180725

peroid_month: 201807

period_week: 30

weekseq: 3

year_day: 206

month_day: 25

1 row in set (0.00 sec)

Qlikview指令碼生成日曆表

多數情況下dw會給報表輸出一張比較全的標準日曆表,如果是這樣的情況,那麼可以直接從dw中讀取,所以我要寫的是dw中沒有提供並且從事實資料中提取並不完整或者太耗資源的情況,其實是可以通過指令碼自動生成乙份標準日曆表,下面就介紹一下思路。定義變數 let vdatemin num makedate 20...

mysql 日曆表 mysql建立日曆表

最近開發遇到乙個需求,需要統計一段時間內每天的各種資料,發現某天沒有的資料沒法顯示出來,所以這時候用一張日曆表去聯合查詢即能獲得每天的資料 建立日曆表用到adddate這個系統函式,這個函式會自動為給定的日期新增指定的時間間隔,adddate 2017 06 20 1 會得出2017 06 21,利...

日曆表作用與HiveSQL生成

在資料處理的過程中,有時候會碰到一些需要使用日曆的場景,在使用中碰到過的有 1.計算工作日 可以抽象一些理解為為不同日期的權重不一樣,工作日權重為1,其他為0 2.計算財年 財務月 財務周 和自然日期有所不同 3.利用日期區間展開一些計算 比如將某張賬單金額拆到賬單對應得乙個時間區間 這裡記錄一段日...