MySQL可以将存储的UTC时间转换为本地时区吗?

时间:2010-02-02 20:51:26

标签: mysql sql timezone convert-tz

MySQL可以将存储的UTC时间直接转换为本地timezon:ed time直接在正常的select语句中吗?

假设您有一些带有时间戳(UTC)的数据。

CREATE TABLE `SomeDateTable` (
  `id`    int(11) NOT NULL auto_increment,
  `value` float NOT NULL default '0',
  `date`  datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
)

然后当我

"select value, date from SomeDateTable";

我当然会以所存储的UTC格式获取所有日期。

但是,让我们说我希望将它们放在另一个时区(使用DST), 然后我可以为选择查询添加一些魔法,以便我在所选时区中获取所有日期吗?

"select value, TIMEZONE(date, "Europe/Berlin") from SomeDateTable";

或者我必须在顶部的其他层中执行此操作,例如在某些PHP代码中? (似乎大多数人都解决了这个问题)。

由于 约翰


如果您的MySQL安装允许您使用CONVERT_TZ,那么这是一个非常干净的解决方案, 这个例子展示了如何使用它。

SELECT CONVERT_TZ( '2010-01-01 12:00', 'UTC', 'Europe/Stockholm' )

但是我不知道这是不是一个好方法,因为有些MySQL安装缺少这个功能,请小心使用。

7 个答案:

答案 0 :(得分:31)

答案 1 :(得分:23)

对于那些无法配置mysql环境的用户(例如由于缺少SUPER访问权限)而使用人性化的时区名称,例如" America / Denver"或" GMT"您也可以使用带有数字偏移的函数,如下所示:

CONVERT_TZ(date,'+00:00','-07:00')

答案 2 :(得分:8)

select convert_tz(now(),@@session.time_zone,'+03:00')

为了获得时间,只能使用:

time(convert_tz(now(),@@session.time_zone,'+03:00'))

答案 3 :(得分:3)

我建议使用

SET time_zone = 'proper timezone';

连接数据库后立即完成一次。在此之后,所有时间戳将在选择时自动转换。

答案 4 :(得分:1)

1。正确设置服务器:

在服务器上,su到root并执行以下操作:

# mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql

(请注意,最后的命令当然是mysql,并且您会将其发送到同名mysql的表中。)

因此,如果您# ls /usr/share/zoneinfo,您将在ubuntu或几乎所有unixish服务器上看到所有时区信息。

(顺便说一句,这是方便地找到某个时区的确切官方名称的便捷方法。)

2。然后在mysql中就变得微不足道了:

例如

mysql> select ts, CONVERT_TZ(ts, 'UTC', 'Pacific/Tahiti') from example_table ;
+---------------------+-----------------------------------------+
| ts                  | CONVERT_TZ(ts, 'UTC', 'Pacific/Tahiti') |
+---------------------+-----------------------------------------+
| 2020-10-20 16:59:57 | 2020-10-20 06:59:57                     |
| 2020-10-20 17:02:59 | 2020-10-20 07:02:59                     |
| 2020-10-20 17:30:08 | 2020-10-20 07:30:08                     |
| 2020-10-20 18:36:29 | 2020-10-20 08:36:29                     |
| 2020-10-20 18:37:20 | 2020-10-20 08:37:20                     |
| 2020-10-20 18:37:20 | 2020-10-20 08:37:20                     |
| 2020-10-20 19:00:18 | 2020-10-20 09:00:18                     |
+---------------------+-----------------------------------------+

答案 5 :(得分:0)

我不确定在DATETIME数据类型上可以做什么数学运算,但是如果你使用PHP,我强烈建议使用基于整数的时间戳。基本上,您可以使用PHP的time()函数在数据库中存储一个4字节的整数。这使得数学上的数学变得更加直接。

答案 6 :(得分:0)

一个人可以轻松使用

CONVERT_TZ(your_timestamp_column_name, 'UTC', 'your_desired_timezone_name')

例如:

CONVERT_TZ(timeperiod, 'UTC', 'Asia/Karachi')

,它也可以在WHERE语句中使用,并比较时间戳,我将在Where子句中使用以下内容:

WHERE CONVERT_TZ(timeperiod, 'UTC', '{$this->timezone}') NOT BETWEEN {$timeperiods['today_start']} AND {$timeperiods['today_end']}