2013-04-04 131 views
45

如何在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; 

尽管在这些时间段之间有数据,但什么也不返回。我是否必须强制将'中的值从''改为'字段到datetime类型的查询中?

+0

什么是数据类型为'game_date'?其日期时间为 – hjpotter92 2013-04-04 20:48:35

+0

。我想我明白了为什么我很困惑。我为mysql使用* toad软件*,默认情况下它使用我在日期范围中使用的格式呈现日期,这就是我使用相同的原因。所以问题是我在我的范围内提供的日期格式。 – codingknob 2013-04-04 21:02:52

+0

如果我使用Eugen Rieck提供的格式,它按预期工作。 – codingknob 2013-04-04 22:13:17

回答

73

您需要更新的日期格式:

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; 
+1

哪一个是日期,哪一个是这里的月份? – Arun 2015-10-14 18:18:11

+3

日期文字的格式为'YYYY-MM-DD HH:mm:SS' – 2015-10-14 19:43:57

+1

使用BETWEEN并不是最佳做法,尤其是因为MySQL现在支持**亚秒的时间精度**。使用23:59:59比一天结束时短一整秒。 '其中game_date> ='2012-03-11'和game_date <'2012-05-12''是定义日期范围的最精确的方式,并可用于从日期到次秒单位的任何时间精度级别。 – 2017-10-21 02:34:01

11

下面是一个使用日期函数的简单方法:

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

我是盲人还是这是一个性能杀手? 'date(game_date)'将比较运行于** calulcated值**,而不是字段 - 导致没有索引使用,并且每一行都被触摸(即全表扫描)! – 2013-04-04 20:57:36

+0

@EugenRieck。 。 。一般来说,假设有'game_date'上的索引是正确的。即使没有索引,该表格也必须适当调整大小,以显着改善性能。关于“hockey_stats”这个名字的一些信息告诉我,这不是一个真正的大桌子。 – 2013-04-04 20:59:38

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)

3

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"]))) 
5

一个简单的方法:

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

以简单的方式就可以查询作为

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

0

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