我有一个包含2个列,id和日期的表。
假设我有一些漏洞(IE我没有存储几天),这是在一段时间内每天检索一行的最佳方法吗?
我想用生成的日期表做LEFT JOIN,但我想知道这是一个更好的方法。
如果没有,这是生成时间表的好方法吗?
谢谢!
答案 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提供的示例。这是一个非常精确的时间表。