如何在mysql选择查询中获取两个日期之间的日期列表

San*_*nan 37 mysql sql

我希望日期列表位于选择查询的两个日期之间.例如:

如果我给'2012-02-10'和'2012-02-15'我需要结果.

date      
----------
2012-02-10
2012-02-11
2012-02-12
2012-02-13
2012-02-14
2012-02-15 
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到?

小智 103

尝试:

select * from 
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) selected_date from
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
where selected_date between '2012-02-10' and '2012-02-15'
Run Code Online (Sandbox Code Playgroud)

- 日期将近300年.

[更正了UrvishAtSynapse的建议编辑.]

  • 如果你能解释一下这个问题我会很感激 (15认同)
  • Rahul,通过将每个数字组合在一起(00000,00001,... 99999)生成100000行.每行的列都会转换为一个数字,该数字会添加到日期"1970-01-01",它会为您提供100000个日期,每行一个,然后进行过滤.从你想要的那天开始(不是1970-01-01),将两者之间转换为'<=',最后将数量级减少到你需要的数量级,就可以获得效率.如果您只需要20个日期,那么100或t0与t1结合,就是您所需要的. (5认同)
  • 不完全正确,`union all` 不会扫描结果集的唯一性,`union distinct` 会。*在这种情况下*性能差异微不足道,但作为最佳实践的例子,它确实很重要(恕我直言) (2认同)

hex*_*rot 22

set @i = -1;
SELECT DATE(ADDDATE('2012-02-10', INTERVAL @i:=@i+1 DAY)) AS date FROM `table`
HAVING 
@i < DATEDIFF('2012-02-15', '2012-02-10') 
Run Code Online (Sandbox Code Playgroud)

这将完全按照规定返回结果集.此查询仅要求您更改datediff和adddate中的两个不同日期.

  • 很好的解决方案,但有一个令人失望的时刻.您在select中声明的表应该具有您想要选择的行数或更多.因此,如果你想要整整一年的日子而你的桌子只有100行,你将只获得前100行.这就是为什么我更喜欢这个解决方案http://stackoverflow.com/a/33411681/3358250 (6认同)
  • 此查询仅列出与“表”中的结果一样多的结果 - 这适用于结果数始终少于记录数但您尝试检索的日期多于记录数的大型记录集在表中它不起作用。 (2认同)

小智 10

在MySQL 5.5中,接受的答案对我不起作用.我更新了查询以便为我工作:

select * from 
(select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from
 (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
 (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
 (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
 (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
 (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
where selected_date between '2012-02-10' and '2012-02-15'
Run Code Online (Sandbox Code Playgroud)

  • 此方法可以完成工作,但如果您发现它有点慢,并且您只需要未来的日期,请将“1970-01-01”替换为“CURDATE()” - 在我的例子中,它通过减少“adddate”调用产生的结果行数。 (2认同)