2011-10-22 230 views
0

我有一個VARCHAR字段completion_date,其中包含一個時間戳日期(例如1319193919)。是否可以在這樣的字段上運行查詢,並將其與NOW()進行比較?我試圖:MySQL比較日期與時間戳

SELECT * FROM (`surveys`) WHERE `active` = '1' AND `archived` = '0' AND `completion_date` > 'NOW()' 

但結果是不是真的是我期待的,這是VARCHAR的原因?如果是這樣,我最好使用哪種日期字段?數據必須保持爲Linux時間戳。使用UNIX_TIMESTAMP()

SELECT * 
FROM (`surveys`) 
WHERE `active` = '1' AND `archived` = '0' AND `completion_date` > UNIX_TIMESTAMP(NOW()) 

而且,刪除引號

回答

3

轉換NOW()一個時間戳你有大約'NOW()'

mysql> SELECT UNIX_TIMESTAMP(NOW()); 
+-----------------------+ 
| UNIX_TIMESTAMP(NOW()) | 
+-----------------------+ 
|   1319288622 | 
+-----------------------+ 

注:如果你需要它,這個函數的反轉是FROM_UNIXTIME()把時間戳轉換成默認的MySQL DATETIME格式。

正如以下注釋中所述,如果您有能力進行更改,建議使用真實的DATETIME類型而不是VARCHAR()來表示此數據。

+2

以完成已經很好的答案:如果您想在不使用任何格式的情況下輕鬆存儲日期,請使用DATETIME/TIME/DATE作爲字段類型。如果你不需要這個功能,VARCHAR會更快! – Anonymous

0

一個Linux時間戳可以很容易地存儲在一個BIGINT(或一個UNSIGNED INT)中,這會使你想要做的比較類型成爲可能。 VARCHAR將做一個詞彙而不是數字的比較,而這不是你想要的。使用BIGINT與NOW()UNIX_TIMESTAMP()一起轉換應該可以得到你想要的。

使用DATETIME數據類型進行存儲甚至更好,並在選擇數據時進行轉換。將它作爲DATETIME存儲將來可以證明您的應用程序,如果您遷移到或添加其他Linux平臺不適用的平臺。那麼你只需要修改你的代碼,而不是轉換你的數據讓它繼續工作。我現在正在開發一個項目,將日期作爲角色數據進行存儲,並且儘管您可能遇到的問題比我們少,因爲您要存儲一段時間郵票,而不是格式化的日期及其伴隨的拼寫錯誤。