Data warehouse for AD dates

后端 未结 1 1707
逝去的感伤
逝去的感伤 2021-02-10 16:27

We\'re creating a historic archive for a world history database and we need a date lookup table which references all dates in AD. How to go about creating the values for this ta

相关标签:
1条回答
  • 2021-02-10 16:49

    Use something like this SQL (using my own table structure, not the one you had though):

    DROP TABLE IF EXISTS time_dimension;
    CREATE TABLE time_dimension (
            id                      INTEGER PRIMARY KEY,  -- year*10000+month*100+day
            db_date                 DATE NOT NULL,
            year                    INTEGER NOT NULL,
            month                   INTEGER NOT NULL, -- 1 to 12
            day                     INTEGER NOT NULL, -- 1 to 31
            quarter                 INTEGER NOT NULL, -- 1 to 4
            week                    INTEGER NOT NULL, -- 1 to 52/53
            day_name                VARCHAR(9) NOT NULL, -- 'Monday', 'Tuesday'...
            month_name              VARCHAR(9) NOT NULL, -- 'January', 'February'...
            holiday_flag            CHAR(1) DEFAULT 'f' CHECK (holiday_flag in ('t', 'f')),
            weekend_flag            CHAR(1) DEFAULT 'f' CHECK (weekday_flag in ('t', 'f')),
            event                   VARCHAR(50),
            UNIQUE td_ymd_idx (year,month,day),
            UNIQUE td_dbdate_idx (db_date)
    
    ) Engine=MyISAM;
    
    DROP PROCEDURE IF EXISTS fill_date_dimension;
    DELIMITER //
    CREATE PROCEDURE fill_date_dimension(IN startdate DATE,IN stopdate DATE)
    BEGIN
        DECLARE currentdate DATE;
        SET currentdate = startdate;
        WHILE currentdate < stopdate DO
            INSERT INTO time_dimension VALUES (
                            YEAR(currentdate)*10000+MONTH(currentdate)*100 + DAY(currentdate),
                            currentdate,
                            YEAR(currentdate),
                            MONTH(currentdate),
                            DAY(currentdate),
                            QUARTER(currentdate),
                            WEEKOFYEAR(currentdate),
                            DATE_FORMAT(currentdate,'%W'),
                            DATE_FORMAT(currentdate,'%M'),
                            'f',
                            CASE DAYOFWEEK(currentdate) WHEN 1 THEN 't' WHEN 7 then 't' ELSE 'f' END,
                            NULL);
            SET currentdate = ADDDATE(currentdate,INTERVAL 1 DAY);
        END WHILE;
    END
    //
    DELIMITER ;
    
    TRUNCATE TABLE time_dimension;
    
    CALL fill_date_dimension('1-01-01','2015-01-01');
    OPTIMIZE TABLE time_dimension;
    
    0 讨论(0)
提交回复
热议问题