-
基於 MySQL 生成日期維度數據
- 創建日期維度數據表
DROP TABLE IF EXISTS `date_dim`; CREATE TABLE IF NOT EXISTS `date_dim` ( `date_sk` BIGINT ( 20 ) NOT NULL AUTO_INCREMENT, `date` VARCHAR ( 255 ) DEFAULT NULL, `month` VARCHAR ( 255 ) DEFAULT NULL, `month_name` VARCHAR ( 255 ) DEFAULT NULL, `quarter` VARCHAR ( 255 ) DEFAULT NULL, `year` VARCHAR ( 255 ) DEFAULT NULL, PRIMARY KEY ( `date_sk` ) USING BTREE ) ENGINE = INNODB DEFAULT CHARSET = utf8;
- 建立日期維度數據生成的存儲過程
-- 建立日期維度數據生成的存儲過程 delimiter // DROP PROCEDURE IF EXISTS pre_populate_date // CREATE PROCEDURE pre_populate_date(IN start_dt date, IN end_dt date) BEGIN WHILE start_dt <= end_dt DO INSERT INTO date_dim (date_sk, date, month, month_name, quarter, year) VALUES ( NULL, start_dt, MONTH(start_dt), monthname(start_dt), QUARTER(start_dt), YEAR (start_dt)); SET start_dt = adddate( start_dt, 1 ); END WHILE; COMMIT; END // delimiter;
- 生成日期維度數據
-- 生成日期維度數據 SET FOREIGN_KEY_CHECKS = 0; TRUNCATE TABLE date_dim; CALL pre_populate_date ( '2000-01-01', '2020-12-31' ); SET FOREIGN_KEY_CHECKS = 1;
- 查看生成數據
mariadb> select * from date_dim order by date_sk desc limit 10; +---------+------------+-------+------------+---------+------+ | date_sk | date | month | month_name | quarter | year | +---------+------------+-------+------------+---------+------+ | 7671 | 2020-12-31 | 12 | December | 4 | 2020 | | 7670 | 2020-12-30 | 12 | December | 4 | 2020 | | 7669 | 2020-12-29 | 12 | December | 4 | 2020 | | 7668 | 2020-12-28 | 12 | December | 4 | 2020 | | 7667 | 2020-12-27 | 12 | December | 4 | 2020 | | 7666 | 2020-12-26 | 12 | December | 4 | 2020 | | 7665 | 2020-12-25 | 12 | December | 4 | 2020 | | 7664 | 2020-12-24 | 12 | December | 4 | 2020 | | 7663 | 2020-12-23 | 12 | December | 4 | 2020 | | 7662 | 2020-12-22 | 12 | December | 4 | 2020 | +---------+------------+-------+------------+---------+------+ 10 rows in set (0.05 sec) mariadb>
- 創建日期維度數據表
-
基於 shell 腳本生成日期維度數據
- 創建 date_dim_generate.sh 腳本文件,內容如下:
#!/bin/bash date1="$1" date2="$2" tempdate=`date -d "$date1" +%F` tempdateSec=`date -d "$date1" +%s` enddateSec=`date -d "$date2" +%s` min=1 max=`expr \( $enddateSec - $tempdateSec \) / \( 24 \* 60 \* 60 \) + 1` cat /dev/null > ./date_dim.csv while [ $min -le $max ] do month=`date -d "$tempdate" +%m` month_name=`date -d "$tempdate" +%B` quarter=`echo $month | awk '{print int(($0-1)/3)+1}'` year=`date -d "$tempdate" +%Y` echo ${tempdate}","${month}","${month_name}","${quarter}","${year}>> ./date_dim.csv tempdate=`date -d "$min day $date1" +%F` tempdateSec=`date -d "$min day $date1" +%s` min=`expr $min + 1` done
- 執行腳本,生成數據
[root@node01 ~]# bash date_dim_generate.sh 2000-01-01 2020-12-31 [root@node01 ~]# cat date_dim.csv 2000-01-01,01,January,1,2000 2000-01-02,01,January,1,2000 2000-01-03,01,January,1,2000 2000-01-04,01,January,1,2000 2000-01-05,01,January,1,2000 ...... 2020-12-27,12,December,4,2020 2020-12-28,12,December,4,2020 2020-12-29,12,December,4,2020 2020-12-30,12,December,4,2020 2020-12-31,12,December,4,2020
- 創建 date_dim_generate.sh 腳本文件,內容如下:
構建並生成日期維度數據表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.