2012-06-06 117 views
0

我有以下表結構:MySQL的DATE返回NULL

uid  | ... | created | ... 
int(10) | ... | int(10) | ... 

created字段填充有時間戳;這裏有查詢SELECT created FROM mytable WHERE 1 LIMIT 5的結果:

created 
---------- 
1308122243 
1308122243 
1308552690 
1309247417 
1309254571 

但是,當我執行SELECT DATE(created) FROM mytable WHERE 1 LIMIT 5,我得到了奇怪的NULL的:

DATE(created) 
------------- 
2013-08-12 
2013-08-12 
NULL 
NULL 
NULL 

爲什麼出現這種情況?

+0

查詢的結果集「SELECT created from mytable WHERE 1 LIMIT 5」有點令人困惑,PLZ粘貼確切結果集 –

回答

5

你可能尋找

SELECT DATE(FROM_UNIXTIME(created)) FROM mytable WHERE 1 LIMIT 5 
+0

是的,情況就是這樣。我在兩分鐘前發現了這一點。但是,您的答案當然會被接受:-) – madfriend

+3

如果日期大於2038-01-19,FROM_UNIXTIME將返回null。這是一個解決方法http://stackoverflow.com/questions/31811527/mysql-from-unixtime-after-2038-01-19 –

1

我想你想

SELECT FROM_UNIXTIME(created) FROM mytable 
0

我發現我自己的錯誤,和解決方案很簡單。

如果您希望將int(10)字段正確解釋爲時間戳,則應該執行DATE(FROM_UNIXTIME(created))而不是DATE(created)

0

你試過FROM_UNIXTIME嗎?

SELECT DATE(FROM_UNIXTIME(`created`)) FROM mytable WHERE 1 LIMIT 5 
3

這是因爲你從根本上誤解了MySQL的日期和時間處理。爲什麼您的日期存儲爲int(10)而不是DATETIMESTAMP?這是錯誤的。

閱讀文檔。 http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date

總而言之,int被轉換爲一個字符串,並且該字符串被解釋爲日期表示。 1308122243被解釋爲13-08-12加上一些額外字符,因此轉換爲2013年8月12日。但1308552690是2013年8月55日,因此無效,因此null

+1

在數據庫中存儲時間戳是一種非常普遍的做法。 OP確實忘記將轉換恢復到最新狀態。 –

+0

@dystroy,在DB中存儲時間戳沒有錯,只是說它們應該存儲爲'TIMESTAMP'而不是'int(10)'。如果你需要小數秒精度是另一回事,但這裏的OP甚至沒有使用小時。 –

+0

另外,在閱讀其他無法控制的數據庫時,它確實有助於轉換數據。 – Gauthier