2013-04-04 132 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;