我正在尝试建立一个数据库,该数据库存储用户指定的每日警报时间。例如,如果每天早上7:00至7:30之间满足某些条件,则用户希望接收警报。在尝试实现这一点时,我需要适应夏令时。以下是我尝试的解决方案:
CONVERT_TZ(UTC_TIME(), 'UTC', userInfo.tz)
将UTC时间转换为用户本地时间。问题1.据我理解,指定时区名称(如美国/东方)应考虑夏令时。例如,在1月1日调用CONVERT_TZ('00:00:00', 'UTC', 'US/EASTERN')
应该会产生'19:00:00',而在7月1日则会产生'20:00:00‘。我说的对吗?
问题2.如果Q1是正确的,我是否需要不断更新MySQL的时区表以保持时区UTC设置的最新更新?
问题3.在MySQL文档SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET')
中给出的示例在我的服务器上运行时生成"NULL
“。这是否是由于没有设置时区表而造成的?
我怎么查这个?
发布于 2011-05-26 21:23:31
如果这产生null,则没有设置TZ表:
SELECT CONVERT_TZ(now(),'US/Eastern','US/Central');
如果没有设置时区表,则可以更新用户表中的小时偏移量,然后执行以下操作:
select utc_timezone() - interval user_timezone_offset_in_hours hour
from userinfo a
where user_id = 999;
但是,您仍然需要一种方法来更新用户的时区。
如果您正在为web应用程序编写此文档,您可以通过javascript获取时区,下面是一个描述如何使用的文章 (还没有尝试过,但它看起来会工作)。
关于以上“间隔”的一点解释..。
MySQL中更多的技巧结构之一是使用INTERVAL
关键字,最好用示例来表示(数值可以是表达式或字段值)。
select now() today, now() - interval 1 day yesterday;
+---------------------+---------------------+
| today | yesterday |
+---------------------+---------------------+
| 2011-05-26 13:20:55 | 2011-05-25 13:20:55 |
+---------------------+---------------------+
您可以任意添加和减去它们,这就是为什么我从来不考虑日期/时间加/减/转换函数的原因。
select now() a, now() - interval 1 day + interval 4 hour + interval 8 minute b;
+---------------------+---------------------+
| a | b |
+---------------------+---------------------+
| 2011-05-26 13:24:16 | 2011-05-25 17:32:16 |
+---------------------+---------------------+
你可以使用负数(负时区偏移应该很好)-这些是相同的:
select now() - interval 1 month a, now() + interval -1 month b;
+---------------------+---------------------+
| a | b |
+---------------------+---------------------+
| 2011-04-26 13:38:05 | 2011-04-26 13:38:05 |
+---------------------+---------------------+
发布于 2011-03-15 22:33:28
我发现这个线程很有帮助,所以决定共享用于导入这些信息的doc页面。在CentOS和RHEL中,我完全按照下面的指示做了,它运行得完美无缺。我现在可以使用CONVERT_TZ函数的参数,如“格林尼治标准时间”和“美国/东方”。
从MySQL文档中,可以导入MySQL时区表信息:
http://dev.mysql.com/tech-resources/articles/4.1/time.html
对于在基于Unix的系统上运行MySQL 4.1.3或更高版本的所有用户(回想一下,这在Windows上还不起作用):
填充时区表.
为此,运行与mysql_tzinfo_to_sql
发行版一起提供的MySQL程序。mysql_tzinfo_to_sql
读取操作系统时区文件并从它们生成SQL语句。SQL语句然后由mysql处理,以加载时区表。
要成功运行mysql_tzinfo_to_sql
,需要知道服务器机器的操作系统时区文件存储在哪里;检查一个名称类似于/usr/share/zoneinfo
的目录。将命令行上的目录名传递给mysql_tzinfo_to_sql
,并将输出发送到mysql程序中。下面是一个例子。
shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
注意:上面的命令假设"mysql_tzinfo_to_sql“和"mysql”在您的路径中。如果没有,则需要在运行命令时向两者提供完整的路径,或者切换到mysql bin文件夹中,并使用如下命令:
shell> ./mysql_tzinfo_to_sql /usr/share/zoneinfo | ./mysql -u root mysql
发布于 2010-09-13 17:53:50
Q1:是的,CONVERT_TZ为您考虑了夏时制。此信息和每个时区的DST启动/结束时间存储在time_zone_*表中。
Q2:是的,正如mysql文档中所述,时区信息随每个区域的政治变化而变化。每次发生更改时,都必须更新time_zone_*表。有时候真是糟透了,这就是其中之一。
Q3:这些是5个时区表,查询它们是否包含任何内容:
select * from mysql.time_zone_transition_type;
select * from mysql.time_zone_transition;
select * from mysql.time_zone_name;
select * from mysql.time_zone_leap_second;
select * from mysql.time_zone;
https://stackoverflow.com/questions/2523286
复制相似问题