MySQL加入时间轴

时间:2010-12-17 12:15:53

标签: sql mysql

我有一个包含2个列,id和日期的表。

假设我有一些漏洞(IE我没有存储几天),这是在一段时间内每天检索一行的最佳方法吗?

我想用生成的日期表做LEFT JOIN,但我想知道这是一个更好的方法。

如果没有,这是生成时间表的好方法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

生成的数据表并不是一个坏主意:数据是固定的,你可以利用索引,如果你将数据保存在内存中就无法做到(好吧,你可以使用临时表,这是仍然使用生成的数据表。)

以下是一个例子:

CREATE TABLE myDateTable (
      id INT(11) not null auto_increment,
      fullDate DATE NOT NULL,
      dYear SMALLINT(11) NOT NULL,
      dQuarter TINYINT(11) NOT NULL,
      dMonth TINYINT(11) NOT NULL,
      dDay TINYINT(11) NOT NULL
      PRIMARY KEY  (id),
      KEY idx_fullDate (fullDate)
) ENGINE=INNODB
;

DELIMITER //

CREATE PROCEDURE fillMyDateTable()
BEGIN

SET @startDate = '2011-01-01';
SET @endDate = '2012-12-31';

REPEAT 

     INSERT INTO myDateTable (fullDate, dYear, dQuarter, dMonth, dDay)

     SELECT thisDate
           , YEAR(thisDate)
           , QUARTER(thisDate)
           , MONTH(thisDate)              
           , DAYOFMONTH(thisDate)
     FROM (SELECT @startDate AS thisDate) f 
           WHERE NOT EXISTS 
           (SELECT 1 FROM myDateTable d WHERE d.fullDate = f.thisDate);

     SET @startDate = DATE_ADD(@startDate, INTERVAL 1 DAY);
     UNTIL (@startDate > @endDate AND @startDate > CURRENT_DATE()) 
END REPEAT;

END

// 

答案 1 :(得分:1)

时间表取决于您的需求。

你需要Quarter精度吗?财政年度精确度?

如果不是只做一个简单的

CREATE TABLE time_dimension AS (SELECT
CURDATE()
DAY()
DAYNAME()
MONTH()
MONTHNAME()
YEAR());

然后添加您可能需要的精度

是的,这听起来像是最好的方法。

This是为PostgreSQL提供的示例。这是一个非常精确的时间表。