構建並生成日期維度數據表

  1. 基於 MySQL 生成日期維度數據
    1. 創建日期維度數據表
      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;
      
    2. 建立日期維度數據生成的存儲過程
      -- 建立日期維度數據生成的存儲過程
      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;
      
    3. 生成日期維度數據
      -- 生成日期維度數據
      SET FOREIGN_KEY_CHECKS = 0;
      TRUNCATE TABLE date_dim;
      CALL pre_populate_date ( '2000-01-01', '2020-12-31' );
      SET FOREIGN_KEY_CHECKS = 1;
      
    4. 查看生成數據
      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> 
      
  2. 基於 shell 腳本生成日期維度數據
    1. 創建 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
      
    2. 執行腳本,生成數據
      [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
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章