2010-02-02 112 views
24

MySQL可以直接在正常的select語句中將存儲的UTC時間轉換爲本地timezon:ed時間嗎?MySQL可以將存儲的UTC時間轉換爲本地時區嗎?

假設您有一些帶有時間戳(UTC)的數據。

CREATE TABLE `SomeDateTable` (
    `id` int(11) NOT NULL auto_increment, 
    `value` float NOT NULL default '0', 
    `date` datetime NOT NULL default '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`) 
) 

後來,當我

"select value, date from SomeDateTable"; 

我當然得到所有的日期作爲其存儲UTC形式。

但是,假設我想讓他們在另一個時區(使用DST), 然後我可以在選擇查詢中添加一些魔法,以便將所有日期返回到所選時區中?

"select value, TIMEZONE(date, "Europe/Berlin") from SomeDateTable"; 

或者我必須這樣做,在一些其他層之上,就像在一些PHP代碼? (這似乎是大多數人已經解決了這個問題)。

感謝 約翰


如果你的MySQL安裝允許您使用CONVERT_TZ它是一個非常乾淨的解決方案, 這個例子說明如何使用它。

SELECT CONVERT_TZ('2010-01-01 12:00', 'UTC', 'Europe/Stockholm') 

但是我不知道這是不是一個好辦法,因爲一些MySQL安裝缺少這個功能,小心使用。

回答

1

我不知道可以在DATETIME數據類型做什麼數學,但如果你使用的是PHP,我強烈建議您使用基於整數的時間戳。基本上,你可以使用PHP的time()函數在數據庫中存儲一個4字節的整數。這使得數學更直接。

+0

convert_tz是我的問題的答案,但是也許我會爲此使用php ...因爲我託管我的網站的服務器也缺少那個時區數據(並且我無法修復它...) – Johan 2010-02-02 21:36:52

3

我建議使用

SET time_zone = 'proper timezone'; 

正在做一次後立即連接到數據庫。之後所有時間戳將在選擇時自動轉換。

+10

需要注意的是,這不會自動轉換DATE,TIME和DATETIME字段。這將只對TIMESTAMP字段進行自動轉換,並影響NOW()和CURDATE()函數的結果。 – Tom 2012-05-19 03:28:29

+0

如果您希望這是永久的,您也可以更改time_zone參數。 – jamsandwich 2017-11-27 03:35:15

12

對於那些無法配置mysql環境(例如由於缺少SUPER訪問權限)使用人性化時區名稱(如「America/Denver」或「GMT」)的用戶,也可以使用帶有數字偏移的函數,如下所示:

CONVERT_TZ(date,'+00:00','-07:00')

+4

如果該時區具有夏令時(http://www.timeanddate.com/time/dst/),這將不起作用,因爲您將有不同的偏移量sommer和冬季,並且還有一些30min DST的示例... – Johan 2013-09-02 14:57:04

+0

有趣..在我的情況下,我必須從PHP運行一些查詢,並且不希望對PHP中的結果執行任何TZ處理,但是我可以輕鬆更改select查詢中的數值。謝謝 – tmsimont 2013-09-03 15:40:50

4

select convert_tz(now(),@@session.time_zone,'+03:00')

對於獲取時間只能使用 時間(CONVERT_TZ(NOW(),@@ session.time_zone, '+ 03:00'))

相關問題