使用标准的mysql函数可以编写一个查询,返回两个日期之间的日期列表。
例如,给定2009-01-01和2009-01-13,它将返回一个包含以下值的单列表:
2009-01-01
2009-01-02
2009-01-03
2009-01-04
2009-01-05
2009-01-06
2009-01-07
2009-01-08
2009-01-09
2009-01-10
2009-01-11
2009-01-12
2009-01-13
编辑:看起来我还没说清楚。我想生成这个列表。我将值存储在数据库中(通过datetime),但希望它们在左外部连接上聚合到如上所述的日期列表中(我希望在某些连接的右侧有几天为null,并将处理此问题)。
发布于 2009-02-04 05:10:05
您可以像这样使用MySQL的user variables:
SET @num = -1;
SELECT DATE_ADD( '2009-01-01', interval @num := @num+1 day) AS date_sequence,
your_table.* FROM your_table
WHERE your_table.other_column IS NOT NULL
HAVING DATE_ADD('2009-01-01', interval @num day) <= '2009-01-13'
@num是-1,因为您在第一次使用它时添加了它。此外,您不能使用"HAVING date_sequence“,因为这会使user变量为每行增加两次。
发布于 2009-02-04 05:48:19
借用this answer中的想法,您可以设置一个从0到9的表,并使用该表生成日期列表。
CREATE TABLE num (i int);
INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);
select adddate('2009-01-01', numlist.id) as `date` from
(SELECT n1.i + n10.i*10 + n100.i*100 AS id
FROM num n1 cross join num as n10 cross join num as n100) as numlist
where adddate('2009-01-01', numlist.id) <= '2009-01-13';
这将允许您生成最多1000个日期的列表。如果需要进行更大规模的查询,可以向内部查询添加另一个交叉联接。
发布于 2019-02-06 00:27:38
使用MariaDB >= 10.3和MySQL >= 8.0中新的递归(公用表表达式)功能的优雅解决方案。
WITH RECURSIVE t as (
select '2019-01-01' as dt
UNION
SELECT DATE_ADD(t.dt, INTERVAL 1 DAY) FROM t WHERE DATE_ADD(t.dt, INTERVAL 1 DAY) <= '2019-04-30'
)
select * FROM t;
上面返回了一个介于'2019-01-01‘和'2019-04-30’之间的日期表格。
https://stackoverflow.com/questions/510012
复制相似问题