Заполнение таблицы измерения времени автоматически - PullRequest
0 голосов
/ 06 марта 2012

В настоящее время я работаю над проектом отчетности.В моем хранилище данных мне нужна таблица измерений «Время», содержащая все даты (может быть, с 01-01-2011?) И которая автоматически увеличивается каждый день, имея этот формат гггг-мм-дд.Кстати, я использую MySQL в Debian.спасибо JT

Ответы [ 4 ]

1 голос
/ 06 марта 2012

См. Этот ответ

Или этот

Есть несколько предложений там.Если ваш диапазон дат будет умеренным, возможно, год или два, и при условии, что ваш отчет использует хранимую процедуру для возврата результатов, вы можете просто создать временную таблицу на лету, используя метод rownum с ограничением, чтобы получить вседаты в диапазоне.Затем присоединитесь к вашим данным, как требуется.

Если уловка Union во втором ответе, кажется, работает хорошо в соответствии с комментариями и может быть расширена до любого максимального диапазона, который вам понадобится.Хотя это очень грязно!

1 голос
/ 08 марта 2012

Эта статья , кажется, охватывает то, что вы хотите.См. Также этот вопрос , где приведен еще один пример столбцов, которые вы можете использовать в своей таблице.Вы должны определенно генерировать большое количество дат заранее, а не обновлять таблицу ежедневно;это экономит много работы и осложнений.100 лет - это всего ~ 36500 строк, что является небольшой таблицей.

Временные таблицы или процедурный код не являются хорошими решениями для хранилища данных, поскольку вы хотите, чтобы инструмент отчетности мог иметь доступ к таблицам измерений.И если в вашей СУБД есть оптимизация для запросов в виде звездообразной схемы (я не знаю, есть ли в MySQL или нет), то она также должна увидеть измерение.

1 голос
/ 06 марта 2012

Вы можете добавить поле ДАТА и использовать такой запрос -

INSERT INTO table(date_column, column1, column2)
  VALUES(DATE(NOW()), 'value1', 'value2');

Кроме того, вы можете добавить столбец TIMESTAMP с ON UPDATE CURRENT_TIMESTAMP, в этом случае значение даты-времени будетобновляться автоматически.

Автоматическая инициализация и обновление для TIMESTAMP

0 голосов
/ 26 сентября 2018

Вот то, что я использую для создания и заполнения таблицы измерения времени:

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')),
        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
            );
        SET currentdate = ADDDATE(currentdate,INTERVAL 1 DAY);
    END WHILE;
END
//
DELIMITER ;

TRUNCATE TABLE time_dimension;
CALL fill_date_dimension('1800-01-01','2050-01-01');
OPTIMIZE TABLE time_dimension;
...