2010-02-13 111 views
22

這聽起來很簡單,但我一直無法弄清楚如何使用簡單的SELECT語句以GMT返回當前時間。當前GMT時間的MySQL查詢

我一直試圖使用CONVERT_TZ()將NOW()轉換爲基於服務器時區和GMT時區的GMT,但由於某種原因,當我放入文本時區時,它返回NULL。我得到結果的唯一方法是實際上輸入偏移量,這對於一個非常簡單的操作來說太複雜了。這裏是我的意思:

mysql> SELECT CONVERT_TZ(NOW(),@@global.system_time_zone,'GMT'); 
NULL 

mysql> SELECT CONVERT_TZ(NOW(),'PST','GMT'); 
NULL 

mysql> SELECT CONVERT_TZ(NOW(),'-08:00','+00:00'); 
2010-02-13 18:28:22 

我需要的只是一個簡單的查詢來返回格林尼治標準時間的當前時間。在此先感謝您的幫助!

+1

注意:使用UTC時間,如果你需要一個通用的時間參考。這是真正的參考,而不是GMT。後者在夏令時開始時會發生變化。 – 2010-02-13 16:49:07

+0

@culebron - 感謝您的建議!問題依然存在。那麼我怎樣才能使用簡單的select語句來獲取當前的UTC時間? – 2010-02-13 16:51:15

回答

31

這應該工作,但

SELECT CONVERT_TZ(NOW(),'PST','GMT'); 

我得到的也NULL作爲結果。有趣的足夠在mysql實況的例子也返回null

SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET'); 

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_convert-tz 看來你發現了一個bug在MySQL 。 (感謝斯蒂芬+普里查德)

你可以嘗試:

SET @[email protected]@TIME_ZONE; 
SET TIME_ZONE='+00:00'; 
SELECT NOW(); 
SET [email protected]_TIME_ZONE; 

確定是不是正是你想要的東西(它的4個查詢,但只有一個選擇:-)

,或者你使用UTC(犯規得到受影響日光節約時間)

SELECT UTC_TIMESTAMP(); 
+3

@Rufinus - 好,我不是瘋了。 MySQL如何在這樣一個重要的功能中出現bug? UTC_TIMESTAMP()正是我所期待的。謝謝! – 2010-02-13 17:42:19

+0

如果數據庫以UTC保存記錄並使用當前時區搜索它們會怎麼樣?一般時區一般是gmt -1,6個月後它變成gmt +1 ?? – shzyincu 2016-04-13 05:21:21

13

在CONVERT_TZ NO BUG()

要使用CONVERT_TZ(),您需要安裝時區表,否則MySql將返回NULL。

從CLI運行以下爲根

#mysql_tzinfo_to_sql在/ usr/share/zoneinfo中| MySQL的-u MySQL的root

查閱http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html

感謝

http://www.ArcanaVision.com(SJP 2011-08-18)

+0

這對我來說幾乎每次都適用,但是這次'convert_tz()'即使在時區更新後也會返回NULL。奇怪!我檢查 - timezone_xxx表已滿。我的服務器版本是5.0.92,從源代碼編譯(我一直這樣做)。從來沒有遇到過這個問題...... – NickSoft 2012-02-24 09:34:23

+3

剛剛發現填充區域表後,「PST」時區仍然不存在。我在維基百科閱讀,它看起來像PST是不夠明確的,因爲夏令時定義時區。有些城市使用DST,有些則沒有。請參閱:http://en.wikipedia.org/wiki/Pacific_Time_Zone#Daylight_time。我使用Pacific/Los_Angeles而不是PST(考慮到DST)。 – NickSoft 2012-02-25 17:31:01

+1

我不得不使用'US/Pacific'從5.5.27數據庫的convert_tz()中獲得一個非NULL值。我通過瀏覽mysql.time_zone_name表來找到這個字符串。 – randalv 2015-01-09 21:12:26

0

看到所有的答案上面,看它是不可靠的轉換到PST後,我只是用這個:

DATE_SUB(user_last_login,INTERVAL 7小時)

+0

抱歉,不清楚它與問題的關係如何 – 2013-07-01 22:05:13

+0

這不包括DST規則。 – Zambonilli 2017-10-31 12:49:43

0

這應該工作 - 我認爲你指定你的時區是錯誤的。使用芝加哥爲例

SELECT CONVERT_TZ(NOW(), 'America/Chicago', 'GMT') 
+0

返回null :( – shzyincu 2016-04-13 05:23:34

+1

要使用CONVERT_TZ(),您需要安裝時區表,否則MySql將返回NULL!它們不會預裝在mysql中 – konung 2016-04-14 14:59:37

4

的萬無一失的方法來獲取當前UTC日期時間是:

SELECT CONVERT_TZ(NOW(), @@session.time_zone, '+0:00') 
-1

有一個在CONVERT_TZ功能上沒有錯誤。由於使用時區名稱/縮寫,您會得到NULL。除非你安裝mysql.time_zone_name表,否則Mysql不知道這個'GMT','PST'等是什麼意思。但是,如果您使用數字,它將始終有效。

mysql> SELECT CONVERT_TZ(NOW(), 'America/Chicago', 'GMT'); 

返回NULL

mysql> SELECT CONVERT_TZ(NOW(),'-08:00','+00:00'); 

回報2016年6月24日17時58分33秒

0

當源服務器時間戳是未知的,但要求是爲特定的TZ做到這一點:

select convert_tz(utc_timestamp(),'+05:00','+00:00') 

以CST爲例。 無論您在哪裏查詢,utc_timestamp都會保證'+00:00'的結果。 '+05:00'是您想要的偏移量。 這種方法在擊中多個未知服務器時效果很好,它可以確保您返回的結果全部在一個通用的tz結果集中。

0

我正在尋找這是GMT + 6(亞洲/達卡時區)

MySQL服務器是在美國我的時區。下面的工作對我來說。

SELECT CONVERT_TZ(UTC_TIMESTAMP(), '+06:00', '+00:00')