80

MySQL 可以直接在普通的 select 语句中将存储的 UTC 时间转换为本地时区时间吗?

假设您有一些带有时间戳 (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 安装缺少此功能,请谨慎使用。

4

6 回答 6

54

是的,有这个convert_tz功能。

于 2010-02-02T20:58:55.013 回答
34

对于那些无法配置 mysql 环境(例如,由于缺乏 SUPER 访问权限)以使用人类友好的时区名称(例如“America/Denver”或“GMT”)的人,您还可以使用带有数字偏移量的函数,如下所示:

CONVERT_TZ(date,'+00:00','-07:00')
于 2013-08-23T23:48:15.187 回答
12
select convert_tz(now(),@@session.time_zone,'+03:00')

仅获取时间使用:

time(convert_tz(now(),@@session.time_zone,'+03:00'))
于 2016-07-11T08:32:51.263 回答
8

一个可以轻松使用

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']}
于 2019-07-31T19:25:21.243 回答
6

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                     |
+---------------------+-----------------------------------------+
于 2020-10-21T14:23:38.923 回答
2

我建议使用

SET time_zone = 'proper timezone';

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

于 2010-02-14T21:56:34.493 回答