MySQL:获取特定时区的当地时间

时间:2012-09-21 12:57:02

标签: mysql timezone

这是表格users的简单版本:

+--------------+-------------------+
|      id      |     timezone      |
+--------------+-------------------+
|       1      | 'Europe/Helsinki' |
|       2      |  'Europe/Paris'   |
+--------------+-------------------+

我想知道这些用户中每个用户的当地时间(具体取决于他们的时区),以便我可以选择用户,例如下午4点。

我正在使用LAMP堆栈,但我只想使用MySQL(不选择所有用户并在PHP循环中运行它们)。

2 个答案:

答案 0 :(得分:7)

使用CONVERT_TZ: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_convert-tz

SELECT * FROM users WHERE hour(CONVERT_TZ(now(), server_tz, `timezone`))=16

答案 1 :(得分:4)

您可以使用set time_zone更改时区:

mysql> set time_zone='Europe/Helsinki';
mysql> select now();
2012-09-21 16:15:06
mysql> set time_zone='Europe/Paris';
mysql> select now();
2012-09-21 15:15:40

使用此功能,您可以定义一个返回用户时区当前时间的函数:

create function current_time_in_tz(tz varchar(40)) returns datetime 
begin
set @old_tz = @@session.time_zone;
set time_zone=tz;
set @now = now();
set time_zone=@old_tz;
return @now;
end

select id, current_time_in_tz(timezone) from users;

请注意,DATE,TIME和DATETIME值不依赖于时区,因此查询时不会自动调整这些类型列中的值。 TIMESTAMP值已调整:

mysql> create temporary table tbl (dt datetime, ts timestamp);
mysql> insert into tbl values (now(),now());
mysql> select * from tbl;
+---------------------+---------------------+
| dt                  | ts                  |
+---------------------+---------------------+
| 2012-09-21 15:21:56 | 2012-09-21 15:21:56 |
+---------------------+---------------------+
mysql> set time_zone='Europe/Helsinki';
mysql> select * from tbl;
+---------------------+---------------------+
| dt                  | ts                  |
+---------------------+---------------------+
| 2012-09-21 15:21:56 | 2012-09-21 16:21:56 |
+---------------------+---------------------+

如果set time_zone因此错误而失败:

ERROR 1298 (HY000): Unknown or incorrect time zone: 'Europe/Helsinki'

您需要使用以下命令将时区信息加载到mysql中:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

有关详细信息,请参阅http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html