如何获取MySQL的当前时区?

如何获取MySQL的当前时区?,mysql,timezone,Mysql,Timezone,有人知道MySQL中是否有这样的函数吗 更新 这不会输出任何有效信息: mysql> SELECT @@global.time_zone, @@session.time_zone; +--------------------+---------------------+ | @@global.time_zone | @@session.time_zone | +--------------------+---------------------+ | SYSTEM

有人知道MySQL中是否有这样的函数吗

更新

这不会输出任何有效信息:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
或者MySQL本身可能无法准确知道所使用的
时区,这很好,我们可以在这里使用
PHP
,只要我可以获得与
SYSTEM
不同的有效信息,…

签出和系统变量。这有用吗?

来自手册():

全局时区和客户端特定时区的当前值可以如下方式检索:
mysql>选择@global.time\u zone、@session.time\u zone

Edit如果MySQL设置为使用系统时区,则上面返回的是
SYSTEM
,这没有什么帮助。由于您使用的是PHP,如果MySQL的答案是
SYSTEM
,那么您可以询问系统使用via的时区。(当然,正如VolkerK所指出的,PHP可能运行在不同的服务器上,但根据假设,假设web服务器和与之对话的DB服务器设置为[如果实际上不在]同一时区并不是一个巨大的飞跃。)但要注意(与MySQL一样),可以设置PHP使用的时区(),这意味着它报告的值可能与操作系统使用的值不同。如果您控制着PHP代码,那么您应该知道自己是否在这样做,并且一切正常

但是MySQL服务器使用的时区的整个问题可能是一个相切的问题,因为询问服务器它所在的时区会告诉您数据库中的数据绝对没有任何信息。详情请继续阅读:

进一步讨论

SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`
如果您控制服务器,当然可以确保时区为已知数量。如果您无法控制服务器,可以按如下方式设置连接使用的时区:

set time_zone = '+00:00';
这将时区设置为GMT,以便任何进一步的操作(如
now()
)都将使用GMT

但是请注意,时间和日期值在MySQL中不与时区信息一起存储:

mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)

mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |      <== Note, no change!
+---------------------+
1 row in set (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 08:32:38 |      <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)
mysql>创建表foo(tstamp-datetime)引擎=MyISAM;
查询正常,0行受影响(0.06秒)
mysql>insert-into-foo(tstamp)值(now());
查询正常,1行受影响(0.00秒)
mysql>设置时区='+01:00';
查询正常,0行受影响(0.00秒)
mysql>从foo中选择tstamp;
+---------------------+
|茨坦普|
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
一行一组(0.00秒)
mysql>设置时区='+02:00';
查询正常,0行受影响(0.00秒)
mysql>从foo中选择tstamp;
+---------------------+
|茨坦普|
+---------------------+
|2010-05-29 08:31:59 |现在选择();
+---------------------+
|现在()|
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
一行一组(0.00秒)
mysql>设置时区='+00:00';
查询正常,0行受影响(0.00秒)
mysql>现在选择();
+---------------------+
|现在()|
+---------------------+

|2010-05-29 08:32:38 |下面的查询返回当前会话的时区

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
简单地
选择@系统\时区

返回
PST
(或与系统相关的任何内容)

如果您试图确定会话时区,可以使用以下查询:
选择是否(@@session.time\u zone='SYSTEM',@@SYSTEM\u time\u zone,@@session.time\u zone)

如果会话时区与系统时区不同,将返回会话时区。

如(创建者或和)在注释中所述,要在
时间中选择当前时区偏移量,请使用:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
它将返回:
02:00:00
如果您的时区是该日期的+2:00


我在这里做了一个备忘:

在更改系统时区后,您只需重新启动mysqld


MySQL的全局时区取系统的时区。当您更改系统的任何此类属性时,只需重新启动Mysqld。

如果您需要GMT差值作为整数:

SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

将虚拟记录插入具有时间戳的数据库之一 选择该记录并获取时间戳的值。 删除该记录。获取服务器用于写入数据的时区,并忽略PHP时区。

可能是

select timediff(current_time(),utc_time())
这样就不能直接获得时区值

@@global.time\u zone
不能使用,因为它是一个变量,并且返回值
'SYSTEM'

如果您需要使用
会话设置时区=
在时区已更改的会话中使用查询,则可以使用
@@session.TIME\u ZONE
获得查询。如果查询
@@global.time\u zone
,则会得到
'SYSTEM'

如果您使用
now()
utc\u time()
尝试
datediff
date\u sub
timediff
,则可能会遇到转换问题

但上述建议可能至少适用于某些服务器版本。我的版本是5.5.43-37,是一个托管解决方案。

我的PHP框架使用

SET LOCAL time_zone='Whatever'
在连接后打开,其中“Whatever”==

不是我的解决方案,但这确保了MySQL服务器的
SYSTEM
时区始终与PHP的时区相同


所以,是的,PHP是一个很难解决的问题,它会影响到它。要获得mysql的当前时区,您可以做以下事情:

 SELECT @@system_time_zone;   # from this you can get the system timezone 
 SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone) # This will give you time zone if system timezone is different from global timezone
现在,如果要更改mysql时区,请执行以下操作:

 SET GLOBAL time_zone = '+00:00';   # this will set mysql timezone in UTC
 SET @@session.time_zone = "+00:00";  # by this you can chnage the timezone only for your particular session 

您可以尝试以下操作:

select sec_to_time(TIME_TO_SEC( curtime()) + 48000);
在这里,您可以将时差指定为秒

使用
LPAD(time_格式(TIMEDIFF(NOW(),UTC_TIMESTAMP),'%H:%i',6',+')
来获取MySQL时区格式的值,您可以方便地使用
CONVERT_TZ()
。请注意,您获得的时区偏移量仅在计算表达式的时刻有效,因为如果您使用夏令时,偏移量可能会随时间而变化。但是,该表达式与
NOW()SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;