在日期/时间范围之间选择数据

Posted

技术标签:

【中文标题】在日期/时间范围之间选择数据【英文标题】:Select data between a date/time range 【发布时间】:2013-03-27 03:04:01 【问题描述】:

如何在 mysql 中选择日期范围内的数据。我的datetime 列采用 24 小时祖鲁时间格式。

select * from hockey_stats 
where game_date between '11/3/2012 00:00:00' and '11/5/2012 23:59:00' 
order by game_date desc;

尽管在这些时间段之间有数据,但不返回任何内容。我是否必须在查询中将 'from''to' 字段中的值强制为 datetime 类型?

【问题讨论】:

game_date 的数据类型是什么? 它的日期时间。我想我明白为什么我会感到困惑了。我正在为 mysql 使用 toad 软件,默认情况下,它以我在日期范围内使用的格式呈现日期,这就是我使用相同格式的原因。所以问题是我在我的范围内提供的日期格式。 如果我使用 Eugen Rieck 提供的格式,它会按预期工作。 How to select records where NOW is between two dates in fields?,对于那些看得更远的人 【参考方案1】:

您需要更新日期格式:

select * from hockey_stats 
where game_date between '2012-03-11 00:00:00' and '2012-05-11 23:59:00' 
order by game_date desc;

【讨论】:

日期文字的格式是 'YYYY-MM-DD HH:mm:SS' 使用 BETWEEN 不是最佳实践,尤其是因为 MySQL 现在支持 亚秒级时间精度。使用 23:59:59 比一天结束还差一整秒。 where game_date >= '2012-03-11' and game_date < '2012-05-12' 是定义日期范围的最精确方式,适用于从日期到亚秒单位的任何时间精度级别。 @Used_By_Already 当这个问题在 2013 年得到回答时,没有亚秒级 MySQL - 我还没有听说过在 23:59 到 00:00 之间开始的曲棍球比赛,开始时间只有亚秒级. 我留下此评论是为了使用具有亚秒级精度的 MySQL 版本的读者。 MySQL 5.6.4 或更高版本支持小数秒。 (无论日期范围用于何种运动或目的。) 这是为了准确性,而不是性能。如前所述,23:59:59 并不是一天的结束。通过使用小于日期/时间范围的上限,您可以巧妙而准确地避免此问题。 where game_date >= '2012-03-11' and game_date < '2012-05-12'【参考方案2】:

这里是使用日期函数的简单方法:

select *
from hockey_stats
where date(game_date) between date('2012-11-03') and date('2012-11-05')
order by game_date desc

【讨论】:

我是盲人还是性能杀手? date(game_date) 将针对计算值而不是字段进行比较 - 导致不使用索引并且每一行都被触及(即全表扫描)! @EugenRieck。 . .假设game_date 上有一个索引,您一般是对的。即使没有索引,表的大小也必须适中,以实现明显的性能差异。 hockey_stats 这个名字告诉我这不是一张很大的桌子。【参考方案3】:

一个简单的方法:

select  * from  hockey_stats 
where  game_date >= '2012-03-11' and game_date  <= '2012-05-11'

【讨论】:

【参考方案4】:

你可能需要使用STR_TO_DATE函数:

select * from hockey_stats 
where
  game_date between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
                and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

(如果 game_date 是一个字符串,您可能需要在其上使用 STR_TO_DATE)

【讨论】:

【参考方案5】:

可以简单的查询为

select * from hockey_stats 
where game_date between '2018-01-01' and '2018-01-31';

如果时间不是问题,这可行。

考虑时间也遵循以下方式:

select * from hockey_stats where (game_date between '2018-02-05 01:20:00' and '2018-02-05 03:50:00');

注意这是 MySQL 服务器。

【讨论】:

【参考方案6】:

MySQL 日期格式是这样的:Y-M-D。您正在使用 Y/M/D。那是错误的。 修改您的查询。

如果你插入像 Y/M/D 这样的日期,它将在数据库中插入空值。

如果您使用的是 php 并且您从表单中获取的日期是这样的 Y/M/D,您可以使用语句替换它。

out_date=date('Y-m-d', strtotime(str_replace('/', '-', $data["input_date"])))

【讨论】:

【参考方案7】:

您可以使用STR_TO_DATE 函数并根据您发布的格式传递您自己的日期参数:

select * from hockey_stats where game_date 
  between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
  and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

或者只使用 MySQL 处理日期的格式 YYYY:MM:DD HH:mm:SS 并将查询设置为

select * from hockey_stats where game_date between '2012-03-11 00:00:00' and'2012-05-11 23:59:00' order by game_date desc;

【讨论】:

【参考方案8】:

您必须搜索日期,以了解如何在数据库中插入 game_date 数据。例如,如果您在长日期或短日期上插入日期值。

SELECT * FROM hockey_stats WHERE game_date >= "6/11/2018" AND game_date <= "6/17/2018"

你也可以使用BETWEEN

SELECT * FROM hockey_stats WHERE game_date BETWEEN "6/11/2018" AND "6/17/2018"

就这么简单。

【讨论】:

我也在尝试,但它无法正常工作,获取随机的日期数据。

以上是关于在日期/时间范围之间选择数据的主要内容,如果未能解决你的问题,请参考以下文章

在日期范围和特定时间范围之间进行选择

在codeigniter中获取两个日期范围之间的数据

在日期范围SQL之间选择PHP脚本中的数据[重复]

MySQL:选择两个日期范围内的所有数据

女士访问选择数据大于日期时间范围

mysql选择范围内的日期时间对象