谁知道MySQL中是否有这样的功能?
UPDATE
这不会输出任何有效信息:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)
或者也许MySQL本身无法准确知道所time_zone使用的,那很好,我们可以参与PHP这里,只要我能得到有效的信息不喜欢SYSTEM......
T.J*_*der 212
从手册(第9.6节):
可以像下面这样检索全局和客户端特定时区的当前值:
mysql> SELECT @@global.time_zone, @@session.time_zone;
编辑SYSTEM如果将MySQL设置为系统时区的slave,则上面返回,这不太有用.由于您使用的是PHP,如果MySQL的答案是SYSTEM,您可以询问系统它使用的时区date_default_timezone_get.(当然,正如VolkerK所指出的那样,PHP可能在不同的服务器上运行,但是假设,假设它正在与之交谈的Web服务器和数据库服务器设置为 [如果不是实际存在 ]同一时区不是巨大的飞跃.)但要注意(与MySQL一样),您可以设置PHP使用的时区(date_default_timezone_set),这意味着它可能报告与操作系统使用的值不同的值.如果您掌握了PHP代码,那么您应该知道自己是否这样做并且没问题.
但是MySQL服务器正在使用的时区的整个问题可能是切线,因为询问服务器它所在的时区对数据库中的数据一无所知.继续阅读详情:
进一步讨论:
如果您控制服务器,当然可以确保时区是已知数量.如果您无法控制服务器,可以设置连接使用的时区,如下所示:
set time_zone = '+00:00';
Run Code Online (Sandbox Code Playgroud)
这将时区设置为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)
Run Code Online (Sandbox Code Playgroud)
因此,了解服务器的时区是在该得到的时间,现在的功能,如条款唯一重要的now(),unix_timestamp()等等; 它没有告诉您有关数据库数据中的日期使用的时区的任何信息.您可以选择假设它们是使用服务器的时区编写的,但这种假设可能存在缺陷.要知道存储在数据的任何日期或时间的时区,你必须确保它们存储与区信息或(像我一样),确保他们总是在GMT.
为什么假设数据是使用服务器的时区写的?嗯,首先,数据可能是使用设置不同时区的连接编写的.该数据库可能已经从一个服务器到另一个服务器,其中服务器是在不同的时区(我遇到了,当我继承了已经从德州搬到加州数据库)移动.但即使数据写在服务器上,当前的时区也是如此,它仍然是模棱两可的.去年,在美国,夏令时于11月1日凌晨2点被关闭.假设我的服务器使用太平洋时区在加利福尼亚,我有值2009-11-01 01:30:00在数据库中.那是什么时候?这是太平洋标准时间11月1日凌晨1:30,或太平洋标准时间11月1日凌晨1:30(一小时后)?你完全没办法知道.道德:始终将日期/时间存储在GMT(不执行DST)并在必要时转换为所需的时区.
小智 176
下面的查询返回当前会话的时区.
select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
Run Code Online (Sandbox Code Playgroud)
And*_*rew 85
只是
SELECT @@system_time_zone;
返回PST(或与您的系统相关的任何内容).
如果您要确定会话时区,可以使用此查询:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);
如果会话时区与系统时区不同,则返回会话时区.
Tim*_*nen 59
正如JakubVrána(创建者或Adminer和NotORM)在评论中提到的,选择当前TIME使用的时区偏移量:
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)
它将返回:02:00:00如果您的时区是该日期的+2:00
我在这里做了一个备忘单:MySQL的时区应该设置为UTC吗?
ttr*_*asn 12
任何人都可以找到 mysql db 的时区。
通过此查询,您可以获得当前时区:
mysql> SELECT @@system_time_zone as tz;
+-------+
| tz |
+-------+
| CET |
+-------+
Run Code Online (Sandbox Code Playgroud)
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`
Run Code Online (Sandbox Code Playgroud)
这将返回时区作为整数(例如:) -6,处理正或负时间(这里是EXTRACT发挥HOUR作用的地方:单独的函数将负时区返回为正数).
要获取mysql的当前时区,您可以执行以下操作:
现在,如果你想更改mysql时区,那么:1.SET GLOBAL time_zone ='+ 00:00'//这将在UTC 2中设置mysql时区.SET @@ session.time_zone ="+00:00"; //通过这个你可以只为你的特定会话设置时区
描述中提到的命令返回“SYSTEM”,这表明它采用服务器的时区。这对我们的查询没有用。
以下查询将有助于了解时区
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;
Run Code Online (Sandbox Code Playgroud)
上述查询将为您提供相对于协调世界时 (UTC) 的时间间隔。这样您就可以轻松分析时区。如果数据库时区是 IST,输出将为 5:30
UTC_TIMESTAMP
在 MySQL 中,UTC_TIMESTAMP 将当前 UTC 日期和时间返回为“YYYY-MM-DD HH:MM:SS”或 YYYYMMDDHHMMSS.uuuuuu 格式的值,具体取决于函数的使用,即在字符串或数字上下文中。
现在()
NOW() 函数。MySQL NOW() 根据函数的上下文(数字或字符串)以“YYYY-MM-DD HH:MM:SS”格式或 YYYYMMDDHHMMSS.uuuuuu 格式返回当前日期和时间的值。CURRENT_TIMESTAMP、CURRENT_TIMESTAMP()、LOCALTIME、LOCALTIME()、LOCALTIMESTAMP、LOCALTIMESTAMP() 是 NOW() 的同义词。