查询日期维度表中的日期范围

时间:2018-12-05 08:39:54

标签: mysql sql date

有一个需要查询的现有“日期”维度表。 结构如下:

ID |年份月|天

如何查询日期范围? 示例:我想获取从03/02/2018到03/02/2020的日期

我尝试了以下操作:

SELECT *
from Dates dateDim
where (dateDim.Year >= 2018 and dateDim.Month >= 2 and dateDim.Day  >= 3) 
  and (dateDim.Year <= 2020 and dateDim.Month <= 2 and dateDim.Day  <= 3);

4 个答案:

答案 0 :(得分:1)

使用标准SQL,您可以将元组(=多列)与单个表达式进行比较:

select *
from dates
where (year, month, day) >= (2018,2,3) and (year, month, day) <= (2020, 1, 3);

但是,并非所有的DBMS产品都支持该功能,但是您并未提及特定的DBMS产品,标签sql表示“标准SQL”。

在线示例:https://rextester.com/NTZH63192


但是您应该真的考虑将其更改为类型为DATE的单个列。

答案 1 :(得分:0)

SELECT *
from Dates dateDim
where dateDim.Year * 10000 + dateDim.Month * 100 + dateDim.Day
      between 20180203 and 20200203

答案 2 :(得分:0)

正如已注释过的那样,更改您的“日期”表,使其实际上包含DATE类型。您可以轻松地从日期中检索年/月/日。涉及您的日期表的最典型的操作将涉及转换为日期,然后进行某些操作(如添加天数/月数等)然后转换回。如果将这些样式存储为日期,则保存该第一步。在数据库的整个生命周期中,正确存储数据将比为存储数据提供的任何虚假原因为您节省更多的钱,

您也可以数学(或严格)地进行此操作:

SELECT * FROM dates WHERE year * 10000 + month * 100 + day BETWEEN 20180203 and 20200103

但是与首先正确存储数据相比,这有点a脚

答案 3 :(得分:0)

如果您使用的是MS-SQL,我建议,如果Year,Month和Day是INT,将它们转换为DateTime并且您拥有更多的控制权,那么这样的话就足够了:

SELECT 
    *
FROM
    Dates.dateDim AS foo
WHERE
     CAST(CAST(foo.Year AS varchar) + '-' + CAST(foo.Month AS varchar) + '-' + CAST(foo.Day AS varchar) AS DATETIME) BETWEEN '2018/02/03' AND '2020/02/03'