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


83

如何在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什么?
hjpotter92 2013年

1
它的日期时间。我想我弄清楚了为什么感到困惑。我正在使用蟾蜍软件用于mysql,默认情况下它以我在日期范围内使用的格式呈现日期,这就是为什么我使用相同的格式。所以问题出在我提供的日期范围内。
–codingknob

如果我使用Eugen Rieck提供的格式,则可以正常使用。
–codingknob

Answers:


143

您需要更新日期格式:

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;

2
这里哪个是日期,哪个月是月份?
阿伦(Arun)2015年

8
对于日期文字的格式是'YYYY-MM-DD HH:MM:SS'
欧根里克

13
使用BETWEEN并不是最佳实践,尤其是因为MySQL现在支持亚秒级的时间精度。使用23:59:59距离一天结束只有整整一秒钟。 where game_date >= '2012-03-11' and game_date < '2012-05-12'是定义日期范围的最精确方法,适用于从日期到亚秒级单位的任何时间精度级别。
Used_By_Already

3
@Used_By_Already当在2013年回答此问题时,没有亚秒级MySQL-我还没有听说过曲棍球比赛在23:59到00:00之间开始,且亚秒级开始时间。
Eugen Rieck

5
我留给亚秒精度的读者使用的是亚秒精度的MySQL版本。MySQL 5.6.4或更高版本支持小数秒。(有关日期范围是针对哪种运动或目的的。)
Used_By_Already

19

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

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

7
我是盲人还是性能杀手?date(game_date)将根据计算得出的值而不是字段进行比较-导致不使用索引,并且每一行都被触摸(即全表扫描)!
Eugen Rieck

1
@EugenRieck。。。一般而言,假设您在上有一个索引,那您是对的game_date。即使没有索引,该表的大小也必须适当调整,以显着改善性能。关于名称的某些信息hockey_stats对我来说,这不是一个很大的表。
Gordon Linoff 2013年

8

一种简单的方法:

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

5

您可能需要使用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)


4

MySQL日期格式是:YMD。您正在使用Y / M / D。错了 修改您的查询。

如果您插入日期,例如Y / M / D,它将在数据库中插入空值。

如果您使用的是PHP,并且从表单中获得的日期类似于此Y / M / D,则可以使用语句替换它。

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

4

可以简单地查询为

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服务器的。


2

您可以使用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;


2

您必须搜索有关如何在数据库中插入该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"

就那么简单。


我正在尝试相同的方法,但无法正常工作,无法获取按日期排列的随机数据。
Manjeet Kumar Nai
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.