MySQL:获取特定时区的本地时间
Posted
技术标签:
【中文标题】MySQL:获取特定时区的本地时间【英文标题】:MySQL: Get local time for a specific time zone 【发布时间】:2012-09-13 21:46:13 【问题描述】:这是一个简单版本的表格users
:
+--------------+-------------------+
| id | timezone |
+--------------+-------------------+
| 1 | 'Europe/Helsinki' |
| 2 | 'Europe/Paris' |
+--------------+-------------------+
我想知道每个用户的当地时间(取决于他们的时区),以便我可以选择例如下午 4 点的用户。
我正在使用 LAMP 堆栈,但我想只使用 mysql 来执行此操作(不选择所有用户并在 php 循环中运行它们)。
【问题讨论】:
为什么不使用 CONVERT_TZ? dev.mysql.com/doc/refman/5.5/en/… 因为我显然是个傻瓜。知道我的 MySQL 服务器在法国,SELECT CONVERT_TZ( NOW( ) , 'Europe/Paris', 'America/New_York' )
工作得非常好!请添加对此问题的答案,说明这一点,我会接受。
我经常在星期五下午吃那个:)
【参考方案1】:
为此使用 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
【讨论】:
我不知道“server_tz”是什么。只需使用 @@session.time_zone 为您提供连接上的当前时区设置。【参考方案2】:您可以使用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
【讨论】:
我已经阅读了手册的那一部分,但它没有帮助。我需要在一个查询中处理多个时区,我不能通过声明连接/服务器/系统变量来做到这一点。 您可以创建一个设置变量的函数,并在查询中调用该函数...见更新。 那行得通,但@nin 的答案正是我想要的。不过谢谢! 哇,我不知道 convert_tz,只是假设它不存在!【参考方案3】:比 Nin 的答案更通用(不取决于服务器的时区)的解决方案是:
SELECT * FROM users WHERE hour( CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', timezone) )=16
如果 MySQL 有一个像 NOW_TZ(timezone) 这样的函数就好了。
【讨论】:
以上是关于MySQL:获取特定时区的本地时间的主要内容,如果未能解决你的问题,请参考以下文章