这是表格的简单版本users:
+--------------+-------------------+
| id | timezone |
+--------------+-------------------+
| 1 | 'Europe/Helsinki' |
| 2 | 'Europe/Paris' |
+--------------+-------------------+
Run Code Online (Sandbox Code Playgroud)
我想知道这些用户中的每个用户的当地时间(取决于他们的时区),以便我可以选择用户,例如下午4点.
我正在使用LAMP堆栈,但我只想使用MySQL(不选择所有用户并在PHP循环中运行它们).
使用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
Run Code Online (Sandbox Code Playgroud)
您可以使用更改时区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
Run Code Online (Sandbox Code Playgroud)
例如,使用此函数,您可以定义一个函数,该函数返回用户所在时区的当前时间:
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;
Run Code Online (Sandbox Code Playgroud)
请注意,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 |
+---------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)
如果set time_zone失败并显示此错误:
ERROR 1298 (HY000): Unknown or incorrect time zone: 'Europe/Helsinki'
Run Code Online (Sandbox Code Playgroud)
您需要使用以下命令将时区信息加载到mysql中:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参见http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
比 Nin 的答案更通用(不取决于服务器的时区)的解决方案是:
SELECT * FROM users WHERE hour( CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', timezone) )=16
Run Code Online (Sandbox Code Playgroud)
如果 MySQL 有一个像 NOW_TZ(timezone) 这样的函数就好了。