0

将一个传递ETL给数据库系统后,我有一个名为“dim_time”的时间维度,该表由许多字段组成,例如:

- id
- year
- month
- day
- hour
- week
- day_of_week

我试图从该表中获取一系列 id,在 2 个日期之间查询它,经过多次测试,我认为最好的选择是concat字段和询问<=>=这是查询:

SELECT `DimTime`.`id` FROM `dim_time` AS `DimTime` 
  WHERE ((CONCAT(`DimTime`.`year`, "-", `DimTime`.`month`, "-", `DimTime`.`day`, " 00:00:00") >= CONCAT(2013, "-", 10, "-", 9, " 00:00:00")) 
  AND (CONCAT(`DimTime`.`year`, "-", `DimTime`.`month`, "-", `DimTime`.`day`, " 00:00:00") <= CONCAT(2013, "-", 11, "-", 13, " 00:00:00"))) 
  ORDER BY `DimTime`.`year` DESC, `DimTime`.`quarter` DESC, `DimTime`.`month` DESC, `DimTime`.`week` DESC, `DimTime`.`day` DESC, `DimTime`.`hour` DESC

此查询返回第 10 个月的第 9 天以及第 11 个月的所有天、第 1 天到第 13 天的行的 ID(查询限制)。

为什么第 10 个月的其余日子没有结果?10 - 31 天之间。

我不知道我是否错过了什么,或者是否MySQL不能将 aconcat作为日期比较。

4

1 回答 1

1

当你有一个类似的日期时它可以工作2013-11-13,但是当你的连接日期类似于时你必须将它转换为日期2013-1-2,因为有效的日期是2013-01-02.

无论如何,最好的办法是在 dim_time 表中添加一个包含完整日期的列。特别是因为即使你让它工作,你的查询也不能使用索引。你必须像这样写

WHERE `DimTime`.`year` >= 2013
AND `DimTime`.`month` >= 10
...

然后可以使用索引。因此,让您的生活更轻松,在您的表格中添加一个完整的日期列。

于 2013-11-13T10:07:47.077 回答