2012-09-21 57 views
4

这里的表users的一个简单的版本:MySQL的:获取本地时间的特定时间区

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

我想知道什么是对这些用户中的每一个本地时间(这取决于他们的时区) ,以便我可以选择用户是谁,例如下午4点。我正在使用LAMP堆栈,但我想这样做只使用MySQL(不选择所有用户并在PHP循环中运行它们)。

+0

为什么不使用CONVERT_TZ? http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_convert -tz – Nin

+0

因为我显然是个笨蛋。知道我的MySQL服务器在法国,'SELECT CONVERT_TZ(NOW(),'Europe/Paris','America/New_York')'工作得很好!请在这个问题上添加一个答案,说明这一点,我会接受它。 – Pioul

+1

我经常在星期五的下午有这个:) – Nin

回答

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 [email protected]_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

+0

我已经阅读了手册的这一部分,并没有帮助。我需要在单个查询中处理多个时区,我不能通过声明连接/服务器/系统变量来实现。 – Pioul

+0

您可以创建一个函数来设置变量,并在查询中调用该函数...请参阅更新。 – Joni

+0

这会工作,但@ nin的答案是我正在寻找的。谢谢你! – Pioul

0

一个更通用(不依赖于服务器的时区),比宁的回答的解决办法是:

SELECT * FROM users WHERE hour(CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', timezone))=16 

这将是很好如果MySQL有一个功能类似NOW_TZ(时区) 。