2010-02-13 68 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')