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

Posted

技术标签:

【中文标题】如何在mysql选择查询中获取两个日期之间的日期列表[重复]【英文标题】:How to get list of dates between two dates in mysql select query [duplicate] 【发布时间】:2012-02-15 14:55:43 【问题描述】:

我希望通过选择查询列出两个日期之间的日期列表。例如:

如果我给出 '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 

我怎样才能得到?

【问题讨论】:

以下两个答案都是正确的,但似乎这不是您要找的。你能提供更多信息吗? 我只想要两个日期之间的日期列表。日期不在我的表中我只是问是否有任何功能,例如我们可以通过 SELECT CURRENT_DATE() 获取当前日期(无需特定表)。或者我们可以有任何其他方法来获取两个日期之间的日期。 @Mark Byers ans 是正确的,但必须再添加一张包含大量数据的表。 Tats y 正在寻找其他解决方案。 @SangeethaKrishnan 我不确定在 mysql/SQL 中这样做是最好的答案。你写这个是为了直接在数据库中使用,还是为了使用另一种语言(如 php/C# 等)的程序? tsabz 下面的回答应该是你需要在数据库中做的。 【参考方案1】:

试试:

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'

-对于未来近 300 年的日期范围。

[在 UrvishAtSynapse 建议的编辑后更正。]

【讨论】:

在这个问题的所有答案以及相关问题的所有答案中,这个解决方案是最简单和最好的。不需要存储过程。只需从此输出制作一个表格。干得好@MarkBannister 如果您能解释一下查询,我将不胜感激 Rahul,这通过将每个数字的组合连接在一起(00000、00001、... 99999)来生成 100000 行。每行的列都被转换为一个数字,该数字被添加到日期“1970-01-01”,这为您提供了 100000 个日期,每行一个,然后被过滤掉。从您想要的那一天(不是 1970-01-01)开始,将中间转换为“ 也许是一个小点:但select 0 i union select 1 union ...中的每个联合都应该是union all 不完全正确,union all 不会扫描结果集的唯一性,union distinct 会。 在这种情况下性能差异是微不足道的,但作为最佳实践的示例,它确实很重要(恕我直言)【参考方案2】:
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') 

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

【讨论】:

我还必须提到table 不需要包含任何日期行,但 SQL 查询只需要存在 FROM。 table 可以是您数据库中的任何表。 我尝试根据使用像您这样的嵌套查询生成的日期来选择日期。参考sqlfiddle 但由于某种原因,查询没有返回任何内容。您能否告诉我您打算如何使用查询生成的这些值? 查询不显示超过 4 条记录.. 总是在日期列中显示 4 条记录...我尝试更改 datediff 函数日期.. 不错的解决方案,但有一个令人失望的时刻。您在 select 中声明的表应该有更多或相同数量的您希望选择的行。因此,如果您想获得一整年的天数,而您的表只有 100 行,那么您将只能获得前 100 行。这就是为什么我更喜欢这个解决方案***.com/a/33411681/3358250 此查询仅列出与table 中一样多的结果 - 这适用于结果数始终少于记录数的大型记录集,但您正在尝试检索比表中记录更多的日期是行不通的。【参考方案3】:

接受的答案在 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'

【讨论】:

此方法可以完成这项工作,但如果您觉得它有点慢,并且您只需要未来的日期,请将 '1970-01-01' 替换为 CURDATE() - 在我的情况下,它通过减少执行时间减少了一半adddate 调用的结果行数。【参考方案4】:

看看这个帖子:Get a list of dates between two dates

查看Ron Savage做的存储过程,这似乎和你需要的相符!

【讨论】:

为什么是 -1 ?这个过程有点复杂但确实很高效,他可以通过它得到他需要的东西。 我给了它一个加一,至少让它回到 0。我刚刚发布了相同的线程,然后看到你已经这样做了。这正是他们所需要的。 为什么在明显不需要存储过程时使用存储过程?【参考方案5】:

您可以创建一个表格,其中包含您可能需要使用的所有日期:

date
2000-01-01
2000-01-02
2000-01-03
...etc..
2100-12-30
2100-12-31

然后按如下方式查询该表:

SELECT date
FROM dates
WHERE date BETWEEN '2012-02-10' AND '2012-02-15'

【讨论】:

感谢您的回复。除了存储这么多数据还有其他方法吗? @SangeethaKrishnan:如果你仔细想想,实际上并没有那么多数据。 100 年的日期只有大约 36500 条记录 - 它几乎不占用您服务器上的存储空间。如果您担心性能,请确保该列已编入索引。 最佳实践要求您不存储可计算数据。将每个日期保存 x 年似乎很不雅。 @hexparrot:同意,但“最佳实践”将在这里得到更广泛的理解。如果 OP 想要一个可移植的日期解决方案,我真的认为将一系列日期存储在一个单独的表中并没有什么巨大的损失,尽管显然缺乏优雅,但索引列作为奖励。接受的答案也是相当可移植的,但由于 MySQL 不允许视图中的子查询,查询不能这样存储。那么,如果 OP 想要在查询之外加入日期序列,那么您的“最佳实践”指南是什么?存储过程?【参考方案6】:
SELECT * FROM tablexxx WHERE datecol BETWEEN '2012-02-10' AND '2012-02-15';

【讨论】:

感谢您的回复。这些日期不在表格中。 我希望它通用。这意味着就像选择 CURRENT_DATE()。 我个人认为不应该允许匿名投票,尤其是没有解释的投票。

以上是关于如何在mysql选择查询中获取两个日期之间的日期列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询选择年份在两个日期之间的行

在日期之间选择mysql查询?

mysql如何提取两个日期之间的所有数据

MySQL在不使用表列的情况下选择两列之间的范围日期

mysql如何查询两个日期之间最大的连续登录

MYSQL:使用 date_format 查询两个日期之间的数据不起作用