2014-01-30 64 views
1

我有一個名爲end_date的字段的MySQL表,其中存儲了UTC日期,類型爲DATETIME。我想知道NOW()end_date之間的差值。我alredy在這裏找到了很多的問題和答案在這裏做到這一點,一些使用UNIX_TIMESTAMP,據我所知,採取輸入值,並將其轉換爲UTC(所以我不能使用它,因爲我的日期是阿雷迪UTC)和其他建議使用TIME_TO_SEC併除以60。這是我撿到:與MySQL獲取日期的差異

INTERVAL (TIME_TO_SEC(UTC_TIMESTAMP()) - TIME_TO_SEC(end_date))/60 MINUTE 

它正常工作,直到當天從end_date的天差地別。此時,減法的結果爲負數,當我在DATE_ADD函數中使用此代碼時,它會輸出錯誤的結果。我怎樣才能解決這個問題?

回答

2

嘗試使用

INTERVAL (TO_SECONDS(UTC_TIMESTAMP()) - TO_SECONDS(end_date))/60 MINUTE 
+1

我在MySQL文檔中找不到TO_SECONDS。順便說一下,我現在不能使用,因爲正如我在我的問題中所說的,存儲日期是UTC,而NOW會返回服務器時區中的當前日期 – Stefano

+0

請點擊此處查看http://dev.mysql.com/doc/refman /5.5/en/date-and-time-functions.html#function_to-seconds,我編輯我的答案設置回UTC_TIMESTAMP() – miltos

2

嘗試ABS

INTERVAL (ABS(TIME_TO_SEC(UTC_TIMESTAMP()) - TIME_TO_SEC(end_date)))/60 MINUTE 

或者,如果你總想積極差異,那麼在end_date檢查它是否晚於nowutc_timestamp。如果它後來用now代替它,差異將是0

0

您可以使用MySQL的TIMESTAMPDIFF()功能:

SELECT TIMESTAMPDIFF(MINUTE, CURRENT_TIME, end_date) 
FROM my_table 

但是,請注意,這個程序,你真的應該使用MySQL的TIMESTAMP數據類型(會話的之間自動轉換time_zone和UTC用於存儲)而不是DATETIME(它不執行時區轉換,但僅存儲該值,就好像一個人拍攝了日曆的照片&個時鐘)。因此,如果您的會話的time_zone是UTC以外的任何內容,並且您當前使用的是DATETIME字段,則會因缺少時區轉換而產生錯誤—,您必須明確調整這些差異,例如,使用CONVERT_TZ()

查看MySQL Server Time Zone Support瞭解更多信息。

+0

我將該值存儲爲日期時間,因爲我總是在我的PHP內部轉換爲UTC和從UTC應用程序,因此不需要在數據庫中進行轉換,因爲我總是確信這些值存儲在UTC – Stefano

+0

@Stefano中:足夠公平,但一定要在執行此操作之前將會話的'time_zone'設置爲UTC(否則用於'CURRENT_TIME'的值將位於不同的時區,MySQL不會將'end_date'轉換爲兼容的值。 – eggyal

+0

這就是爲什麼我使用UTC_TIMESTAMP而不是NOW例如:D – Stefano