2012-06-17 79 views
4

我試圖用UNIX_TIMESTAMP函數返回值,但它的行爲古怪。UNIX_TIMESTAMP返回0

set @currentdate:= UNIX_TIMESTAMP(NOW() + 1000) /* 1339947588 */ 
set @currentdate:= UNIX_TIMESTAMP(NOW() + 2000) /* 1339948188 */ 
set @currentdate:= UNIX_TIMESTAMP(NOW() + 3000) /* 1339948788 */ 

set @currentdate:= UNIX_TIMESTAMP(NOW() + 4000) /* 0 */ 
set @currentdate:= UNIX_TIMESTAMP(NOW() + 5000) /* 0 */ 
set @currentdate:= UNIX_TIMESTAMP(NOW() + 6000) /* 0 */ 
set @currentdate:= UNIX_TIMESTAMP(NOW() + 7000) /* 0 */ 

set @currentdate:= UNIX_TIMESTAMP(NOW() + 8000) /* 1339949388 */ 
set @currentdate:= UNIX_TIMESTAMP(NOW() + 9000) /* 1339949988 */ 
set @currentdate:= UNIX_TIMESTAMP(NOW() + 10000) /* 1339950588 */ 

爲什麼它會返回0 4000-7000之間的值的價值?

我看到了什麼是當前時刻對應的答案,因爲時間間隔,這給出了0,通過傳遞時間的變化。可能是什麼原因?

在此先感謝,

回答

4

這並不奇怪。對結果調用UNIX_TIMSETAMP()之前,您要添加一些數字的NOW()結果。我想你想加入你的價值觀之前調用UNIX_TIMESTAMP

UNIX_TIMESTAMP(NOW()) + 4000 

或只是

UNIX_TIMESTAMP() + 4000 

這兩項將4000添加到當前的時間。另一種解決方案是使用INTERVAL關鍵字添加時間單位爲日期:

NOW() + INTERVAL 4000 SECOND 

根據the manual,當NOW() + 4000進行評價時,NOW()返回這個格式的數字:YYYYMMDDHHMMSS.uuuuuu,例如20071215235026.000000。如果你爲此添加4000,你可能會或可能不會得到類似於真實日期的東西。正如你所看到的,你會不會添加秒鐘或任何其他定義的實體。如果你得到一個正確的日期UNIX_TIMESTAMP會返回一個時間戳,否則將返回0

+0

真的很好答案+1 –

2

使用NOW()進行測試會導致令人困惑的結果。因此,讓我們把它變成一個變量:

SET @now=NOW(); 

讓我們來看看它:

SELECT @now; 
-> 2012-06-17 17:42:01 

嗯。也許我們想在數字上下文中使用它?

SET @now=NOW()+0; 
SELECT @now; 
-> 20120617174201 
SELECT UNIX_TIMESTAMP(@now); 
-> 1339947721 

啊。那是什麼?這是當前的日期和時間。 2012-06-17 17:42:01及其UNIX時間戳。

而現在呢?

SELECT @now + 2000; 
-> 20120617176201 
SELECT UNIX_TIMESTAMP(@now + 2000); 
-> 0 

根據上述的邏輯,它將代表2012-06-17 17:62:01。這是無效的,這使得UNIX_TIMESTAMP()發牢騷。

如果我們這樣做,但是,

SELECT @now + 7000; 
-> 20120617181201 
SELECT UNIX_TIMESTAMP(@now + 7000); 
-> 1339949521 

我們到達了一系列可再次進行評估有效時間(2012-06-17 18:12:01)。

+0

詳細解釋+1 –