【问题标题】:Select from a range of dates in MySQL从 MySQL 中的一系列日期中选择
【发布时间】:2020-07-15 20:34:13
【问题描述】:

是否可以选择每个日期为一行的日期范围?
我想做的是这样的伪代码:

SELECT date from dual where date >= "2019-01-01" AND date <= "2019-01-05"

结果应该是带有值的单列:

2019-01-01
2019-01-02
2019-01-03
2019-01-04
2019-01-05

这在 MySQL 中是否可行?

【问题讨论】:

    标签: mysql sql database date doctrine-orm


    【解决方案1】:

    在 MySQL 8.0 中,您可以使用递归查询来做到这一点:

    with recursive cte as (
        select '2019-01-01' dt
        union all select dt + interval 1 day from cte where dt < '2019-01-05'
    )
    select dt from cte order by dt
    

    Demo on DB Fiddle:

    | dt | | :--------- | | 2019-01-01 | | 2019-01-02 | | 2019-01-03 | | 2019-01-04 | | 2019-01-05 |

    在早期版本中,解决方案通常包括一个数字表,其中包含从 0 开始的连续整数。

    create table mynumbers (n int);
    insert into mynumbers values(1), (2), (3), (4), (5);
    
    select '2019-01-01' + interval n day dt
    from mynumbers n
    where '2019-01-01' + interval n day <= '2019-01-05'
    

    Demo

    注意:如果需要生成非常大的数据集,“数表”方案比递归查询效率更高。

    【讨论】:

      【解决方案2】:

      你可以试试,

      SELECT date from dual 
      where date >= (SELECT min(a.date) from DatesTable a) 
      AND date <= (SELECT max(b.date) from DatesTable b)
      

      或

          SELECT date from dual 
          where date BETWEEN  (SELECT min(a.date) from DatesTable a) 
                               AND 
                              (SELECT max(b.date) from DatesTable b)
      

      您还可以在子查询中添加一些条件(通过使用 WHERE 子句)以反映不同的情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-07
        • 2016-06-02
        • 2021-08-31
        • 1970-01-01
        相关资源
        最近更新 更多