2011-12-10 36 views
11

我已經將用戶註冊的日期保存爲日期時間,因此,例如2011-12-06 10:45:36。我已經運行此查詢和我預期這個項目 - 2011-12-06 10點45分36秒 - 將被選中:MySQL - 從兩個日期之間的數據庫中選擇數據

SELECT `users`.* FROM `users` WHERE created_at >= '2011-12-01' AND 
created_at <= '2011-12-06' 

但並非如此。存在任何優雅的方式,如何選擇這個項目?作爲第一個想法,我得到了像2011-12-06 + 1,但這看起來不太好。

回答

25

你的問題是日期的短版採用午夜爲默認值。所以你的查詢實際上是:

SELECT users.* FROM users 
WHERE created_at >= '2011-12-01 00:00:00' 
AND created_at <= '2011-12-06 00:00:00' 

這就是爲什麼你沒有看到10:45的記錄。

將其更改爲:

SELECT users.* FROM users 
WHERE created_at >= '2011-12-01' 
AND created_at <= '2011-12-07' 

您還可以使用:

SELECT users.* from users 
WHERE created_at >= '2011-12-01' 
AND created_at <= date_add('2011-12-01', INTERVAL 7 DAY) 

將在你正在尋找相同的時間間隔選擇所有用戶。

您也可能會發現BETWEEN操作更具可讀性:

SELECT users.* from users 
WHERE created_at BETWEEN('2011-12-01', date_add('2011-12-01', INTERVAL 7 DAY)); 
0

也許用在兩者之間更好。它爲我工作得到範圍,然後過濾它

1

你試過前後,而不是> =和< =?另外,這是一個日期或時間戳?

+0

是的,表中的列是時間戳 – user984621

+0

我的不好,前後都是別的。對於時間戳,您需要添加時間以及其他人已回答的日期。 – vextorspace

1

搜索created_at <= '2011-12-06'將搜索在2011-12-06 的午夜或之前創建的任何記錄。你想搜索created_at < '2011-12-07'

+0

明白,謝謝! – user984621

3

您需要使用'2011年12月7日'作爲結束點作爲沒有時間默認的日期到時間00:00:00。

所以,你實際上已經寫了什麼被解釋爲:

SELECT users.* 
FROM users 
WHERE created_at >= '2011-12-01 00:00:00' 
    AND created_at <= '2011-12-06 00:00:00' 

而且你的時間戳:2011-12-06 10時45分36秒這不是在這些點之間。
更改此太:

SELECT users.* 
FROM users 
WHERE created_at >= '2011-12-01' -- Implied 00:00:00 
    AND created_at < '2011-12-07' -- Implied 00:00:00 and smaller than 
            --     thus any time on 06 
+0

+1我認爲我們在同一時間發佈了相同的答案:-) – dash

+0

@dash實際上Loki在半分鐘之前發佈了它,他本應該是被接受的答案,但是你更幸運。爲他+1更快的回答,+1給你給他+1。 –

5
SELECT users.* FROM users WHERE created_at BETWEEN '2011-12-01' AND '2011-12-07'; 
1

另一種方法是使用DATE()功能左手操作如下圖所示

SELECT users.* FROM users WHERE DATE(created_at) BETWEEN '2011-12-01' AND '2011-12-06' 

 

0

您可以使用MySQL DATE fu nction像下面

舉例來說,如果你想2017年9月5日之間的結果,直到2017年9月9日

SELECT DATE(timestamp_field) as date FROM stocks_annc WHERE DATE(timestamp_field) >= '2017-09-05' AND DATE(timestamp_field) <= '2017-09-09' 

確保包裝單引號內的日期''

希望這有助於。

相關問題