2010-04-22 124 views
11

我需要從本地時間UTC轉換現有(日期時間字段)數據庫。Mysql:從本地時間到UTC轉換DB

值存儲廣告日期時間與服務器上的時區CET(+1)(與夏季+2)。當選擇數據時,我使用UNIX_TIMESTAMP(),它可以神奇地補償一切,即時區偏移和dst(如果我已經閱讀了文檔)。

我正在將數據庫移動到UTC作爲系統時間的新服務器。

簡單地減去-1 H將不起作用,因爲夏令時是+2。

任何想法,一個聰明的方法來做到這一點? (使用SQL或一些腳本郎)

回答

23

首先,你需要確保被填充mysql.time_zone_name表。如果它是空的,你可以按照說明此頁面上填充它:

http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html

它通常作爲shell中運行如下命令即可:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql 

一旦表填入您可以使用CONVERT_TZ()函數在數據庫中更新現有的值:

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_convert-tz

這裏有兩個例子來說明如何從CET冬季轉換日期時間爲UTC與夏季:

mysql> SELECT CONVERT_TZ('2010-01-22 12:00:00','CET','UTC'); 
+-----------------------------------------------+ 
| CONVERT_TZ('2010-01-22 12:00:00','CET','UTC') | 
+-----------------------------------------------+ 
| 2010-01-22 11:00:00       | 
+-----------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT CONVERT_TZ('2010-07-22 12:00:00','CET','UTC'); 
+-----------------------------------------------+ 
| CONVERT_TZ('2010-07-22 12:00:00','CET','UTC') | 
+-----------------------------------------------+ 
| 2010-07-22 10:00:00       | 
+-----------------------------------------------+ 
1 row in set (0.00 sec) 
+0

嗨,我知道這是一段時間,因爲你的答案,但由於某種原因,選擇語句不適合我...我檢查了文檔,我能夠得到'SELECT CONVERT_TZ('2004-01-01 12 :00:00','+ 00:00','+ 10:00');',但不是你上面描述的...有什麼我失蹤了嗎?我一直爲它爲空。 – KVISH 2012-06-25 01:34:18

+3

@kalvish,你可能只需要填充mysql.time_zone_name表。嘗試在shell中運行這個命令來填充該表:'mysql_tzinfo_to_sql/usr/share/zoneinfo | mysql -u root mysql' – 2012-06-25 12:06:55

+0

SELECT CONVERT_TZ('2017-02-15 08:00:00',「UTC」,「CST」); return null – wyx 2017-03-29 10:00:39

5

應當注意的是,日期從一個時區到另一個或UTC轉換隻能可靠地如果做日期在過去。

時區定義更改。它們是如何偏離「太陽時鐘」的人類定義,而這些定義可以並且確實會不斷變化。所以唯一有效的轉換是過去的日期,因爲這不會改變。

在未來的任何日期不能可靠地進行轉換,因爲轉換隻能考慮當前已知時區的定義。

簡單的例子:我們在德國柏林創建會議約會明年。我們今天同意我們想在2014年7月1日12:00在亞歷山大廣場見面。該日期將被轉換爲當天10:00世界標準時間。

現在,如果一些政府決定退出夏令時2014年的,你必須決定你是否應該在12:00當地時間出現了問題,或者在11:00本地時間,因爲轉換回從UTC時間將導致不同的當地時間。

如果你救了「2014年7月1日12:00歐洲/柏林」的原來的日期,你會在那裏在確切的時間在中午,和其他人一樣。

2

在原來的服務器,你可以使用下面的表達式之一的UPDATE查詢中:

CONVERT_TZ(your_datetime_field,'SYSTEM','UTC') CONVERT_TZ(your_datetime_field,@@global.time_zone,'UTC')

或者,在目標服務器上,如果你知道原始服務器的時區(如 '歐洲/柏林'),可以使用下列表達式之一:

CONVERT_TZ(your_datetime_field,'Europe/Berlin','UTC') CONVERT_TZ(your_datetime_field,'Europe/Berlin',@@global.time_zone)