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

Joh*_*han 50 mysql sql timezone convert-tz

MySQL能否将存储的UTC时间直接转换为本地timezon:ed时间直接在正常的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`)
)
Run Code Online (Sandbox Code Playgroud)

然后,当我

"select value, date from SomeDateTable";
Run Code Online (Sandbox Code Playgroud)

我当然得到他们存储的UTC表格中的所有日期.

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

"select value, TIMEZONE(date, "Europe/Berlin") from SomeDateTable";
Run Code Online (Sandbox Code Playgroud)

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

谢谢约翰


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

SELECT CONVERT_TZ( '2010-01-01 12:00', 'UTC', 'Europe/Stockholm' )
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*her 36

是的,convert_tz函数.

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_convert-tz

  • mysql_tzinfo_to_sql/usr/share/zoneinfo | mysql -u root mysql (7认同)

tms*_*ont 27

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

CONVERT_TZ(date,'+00:00','-07:00')
Run Code Online (Sandbox Code Playgroud)

  • 如果该时区具有夏令时(http://www.timeanddate.com/time/dst/),那将无效,因为您将有不同的偏移sommer和冬季,并且还有一些30min DST的例子... (5认同)

小智 9

select convert_tz(now(),@@session.time_zone,'+03:00')
Run Code Online (Sandbox Code Playgroud)

为了得到时间只使用:

time(convert_tz(now(),@@session.time_zone,'+03:00'))
Run Code Online (Sandbox Code Playgroud)


Fat*_*tie 9

1. 正确设置您的服务器:

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

# mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql
Run Code Online (Sandbox Code Playgroud)

(请注意,最后的命令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                     |
+---------------------+-----------------------------------------+
Run Code Online (Sandbox Code Playgroud)


MR_*_*DEV 6

一个可以轻松使用

CONVERT_TZ(your_timestamp_column_name, 'UTC', 'your_desired_timezone_name')
Run Code Online (Sandbox Code Playgroud)

例如:

CONVERT_TZ(timeperiod, 'UTC', 'Asia/Karachi')
Run Code Online (Sandbox Code Playgroud)

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

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