Хранилище данных на даты AD - PullRequest
4 голосов
/ 01 мая 2011

Мы создаем исторический архив для базы данных мировой истории, и нам нужна таблица поиска дат, которая ссылается на все даты в AD.Как создать значения для этой таблицы - с 1 по 2011 год в формате ГГГГ / ММ / ДД?База данных MySQL.

Проблемы:

  1. Я использую Excel для предварительного заполнения дат, а затем импортирую в MySQL как: YYYY / MM / DD, но Excel нене распознает такие годы, как 0007, 0008 и т. д., поэтому я не могу автоматически копировать ячейки для создания дат.Я должен сделать это вручную, и это займет несколько дней, чтобы перейти с 1AD к 2011 году, когда ГГГГ / ММ / ДД.

  2. В 1752 году были введены високосные годы.обрабатывать дела до 1752 года без високосных лет?Это сгенерирует неправильные даты.

Моя таблица:

    CREATE TABLE `dates` (
      `date_id` int(10) NOT NULL,
      `format` char(10) NOT NULL,
      `century` int(10) NOT NULL,
      `decade` int(10) NOT NULL,
      `year` int(10) NOT NULL,
      `month` int(10) NOT NULL,
      `week` int(10) NOT NULL,
      `day` int(10) NOT NULL,
      `month_year` int(10) NOT NULL,
      `week_year` int(10) NOT NULL,
      `week_month` int(10) NOT NULL,
      `day_year` int(10) NOT NULL,
      `day_month` int(10) NOT NULL,
      `day_week` int(10) NOT NULL,
      PRIMARY KEY (`date_id`)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1 Ответ

7 голосов
/ 01 мая 2011

Используйте что-то вроде этого SQL (используя мою собственную структуру таблиц, а не ту, что у вас была):

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;
...