【问题标题】: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 子句)以反映不同的情况。