【问题标题】:Generate time dimension in mysql在mysql中生成时间维度
【发布时间】:2016-07-12 08:09:44
【问题描述】:

我正在尝试使用以下字段创建一个 mysql 表: 年、月、日、时、分

从 10 年前到未来 10 年。

我有这个可以创建几天,但它不包括小时和分钟

SET @d0 = "2012-01-01";
SET @d1 = "2012-12-31";

SET @date = date_sub(@d0, interval 1 day);

# set up the time dimension table
DROP TABLE IF EXISTS time_dimension;
CREATE TABLE `time_dimension` (
`date` date DEFAULT NULL,
`id` int NOT NULL,
`y` smallint DEFAULT NULL,
`m` smallint DEFAULT NULL,
`d` smallint DEFAULT NULL,
`yw` smallint DEFAULT NULL,
`w` smallint DEFAULT NULL,
`q` smallint DEFAULT NULL,
`wd` smallint DEFAULT NULL,
`m_name`  char(10) DEFAULT NULL,
`wd_name` char(10) DEFAULT NULL,
PRIMARY KEY (`id`)
);

# populate the table with dates
INSERT INTO time_dimension
SELECT @date := date_add(@date, interval 1 day) as date,
# integer ID that allows immediate understanding
date_format(@date, "%Y%m%d") as id,
year(@date) as y,
month(@date) as m,
day(@date) as d,
date_format(@date, "%x") as yw,
week(@date, 3) as w,
quarter(@date) as q,
weekday(@date)+1 as wd,
monthname(@date) as m_name,
dayname(@date) as wd_name
FROM T
WHERE date_add(@date, interval 1 day) <= @d1
ORDER BY date
;

我怎样才能修改它,使它也能做几小时和几分钟? 谢谢!

【问题讨论】:

  • 您有什么理由不想为此使用时间戳吗?我认为管理这么多不同的时间组件有时会变得一团糟。
  • 但是为什么?哦,人性:-(
  • 请告诉我们您为什么要这样做?存储 20 年内每分钟的时间记录的表的目的是什么?
  • 我想存储 17k 个股票市场符号的历史数据,我认为它不仅可以防止与数据提供者通信时出现不一致(因为时间维度表会有一个防止重复的索引),而且检索系列也会更快,因为我不必根据时间戳即时分组,它会在时间维度上抛出索引
  • 我不明白您为什么要这样做,但是,您可以查看有关 date_add() 函数的 MySQL 文档并检查 MySQL 中是否有其他函数可以检索 datetime 值的其他部分(是的,有)。基于这些,您可以更新您的查询。

标签: php mysql data-warehouse


【解决方案1】:

如果您选择时间维度,建议您将日期和时间维度分开,将两者结合起来将为您的维度生成 >10m 条记录,而分开日期和时间维度将为您提供 7300 行日期维度和 1440 行时间维度(小时/分钟)的行,然后您将需要事实表中时间维度的前键,就像您使用日期维度设计它一样。

【讨论】:

  • 这真是个好主意!谢谢!你知道我怎样才能生成这些尺寸吗?
  • @gabrielmellace 似乎这个 Q 中的脚本适用于 mysql stackoverflow.com/questions/6413175/time-dimension-fill-problem
  • 你知道我怎样才能修改它只做几分钟而不是几秒钟吗?
  • 问题中的脚本不包括秒,就像您要查找的内容一样,我猜您正在查看第二个答案的脚本?只需先创建表 sc_time (或重命名)然后创建过程并运行它(将 currentdate 替换为 datetime ,如接受的答案)不幸的是我没有要测试的 mySql
【解决方案2】:

这是我正在使用的

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多