2011-10-27 49 views
2

我有表(名爲tasks)列created_at,基本上,它包含UNIX時間戳。如何比較MySQL中的日期?

我只需要選擇在指定的時間間隔內創建的結果。

區間爲today,tomorrow,this weekthis month

我認爲如果我將時間戳轉換爲YYYY-MM-DD HH:MM:SS格式,MySQL可以處理它。

此外,我認爲我也需要在那裏使用BETWEEN

因此,我通過時間戳來查詢和比較(檢查?)它在指定的時間間隔內存儲在數據庫中。要轉換,我需要使用FROM_UNIXTIME,對吧?

如何指定這些間隔?謝謝你的建議!

回答

7

您需要轉換UNIX_TIMESTAMP。

查詢

SELECT * FROM tasks 
WHERE created_at BETWEEN UNIX_TIMESTAMP(DATE_SUB(now(),INTERVAL 1 DAY)) 
        AND UNIX_TIMESTAMP(now()) 

您可以通過執行變更爲一週的時間間隔,月等:

INTERVAL 1 WEEK 
INTERVAL 1 MONTH 
INTERVAL 1 YEAR 

MySQL將自動需要幾個月的時間長度和閏年等考慮在內。

在上面的查詢中MySQL將能夠使用索引,加快了很多事情。
請確保不是在您的列上使用某個函數,因爲在這種情況下,MySQL無法在該字段上使用索引,從而導致主要遲滯。

編碼恐怖,很慢

SELECT * FROM tasks 
WHERE FROM_UNIXTIME(created_at) BETWEEN DATE_SUB(now(),INTERVAL 1 DAY) 
            AND now() 

參見:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add

+0

@Tadeck,謝謝你:-) – Johan

+0

沒問題,只是簡單的錯字:) – Tadeck

+0

謝謝,約翰。例如,這個月呢?我需要把多少作爲間隔? 30? – daGrevis

1

我猜created_at被定義爲INT和您存儲的時間戳在裏面。然後,比如說,今天最好的辦法,應該是:

created_at BETWEEN UNIX_TIMESTAMP(CURDATE()) AND UNIX_TIMESTAMP(CURDATE() + INTERVAL 1 DAY)

注意下面也將工作:

FROM_UNIXTIME(created_at) BETWEEN CURDATE() AND (CURDATE() + INTERVAL 1 DAY)

,但你可能會沒有機會使MySQL使用列索引。對於周/月,您需要使用WEEK()和MONTH()內置函數(獲取當前周/月的第一秒的時間戳)的更復雜的邏輯。