首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取介于两个日期之间的日期列表

获取介于两个日期之间的日期列表
EN

Stack Overflow用户
提问于 2009-02-04 03:58:01
回答 15查看 157.3K关注 0票数 94

使用标准的mysql函数可以编写一个查询,返回两个日期之间的日期列表。

例如,给定2009-01-01和2009-01-13,它将返回一个包含以下值的单列表:

代码语言:javascript
复制
 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,并将处理此问题)。

EN

回答 15

Stack Overflow用户

发布于 2009-02-04 05:10:05

您可以像这样使用MySQL的user variables

代码语言:javascript
复制
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变量为每行增加两次。

票数 14
EN

Stack Overflow用户

发布于 2009-02-04 05:48:19

借用this answer中的想法,您可以设置一个从0到9的表,并使用该表生成日期列表。

代码语言:javascript
复制
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个日期的列表。如果需要进行更大规模的查询,可以向内部查询添加另一个交叉联接。

票数 8
EN

Stack Overflow用户

发布于 2019-02-06 00:27:38

使用MariaDB >= 10.3和MySQL >= 8.0中新的递归(公用表表达式)功能的优雅解决方案。

代码语言:javascript
复制
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’之间的日期表格。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/510012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档