首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL CONVERT_TZ()

MySQL CONVERT_TZ()
EN

Stack Overflow用户
提问于 2010-03-26 12:48:21
回答 3查看 89.5K关注 0票数 44

我正在尝试建立一个数据库,该数据库存储用户指定的每日警报时间。例如,如果每天早上7:00至7:30之间满足某些条件,则用户希望接收警报。在尝试实现这一点时,我需要适应夏令时。以下是我尝试的解决方案:

  1. 存储用户本地时区(以长形式存储,如( "US/Eastern")一个表中的信息(例如userInfo),另一个表中的警报时间(例如userAlarms)。
  2. 查询userAlarms表时,通过userInfo表中存储的tz列通过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“。这是否是由于没有设置时区表而造成的?

我怎么查这个?

EN

回答 3

Stack Overflow用户

发布于 2011-05-26 21:23:31

如果这产生null,则没有设置TZ表:

代码语言:javascript
运行
复制
SELECT CONVERT_TZ(now(),'US/Eastern','US/Central');

如果没有设置时区表,则可以更新用户表中的小时偏移量,然后执行以下操作:

代码语言:javascript
运行
复制
select utc_timezone() - interval user_timezone_offset_in_hours hour
from userinfo a
where user_id = 999;

但是,您仍然需要一种方法来更新用户的时区。

如果您正在为web应用程序编写此文档,您可以通过javascript获取时区,下面是一个描述如何使用的文章 (还没有尝试过,但它看起来会工作)。

关于以上“间隔”的一点解释..。

MySQL中更多的技巧结构之一是使用INTERVAL关键字,最好用示例来表示(数值可以是表达式或字段值)。

代码语言:javascript
运行
复制
select now() today, now() - interval 1 day yesterday;
+---------------------+---------------------+
| today               | yesterday           |
+---------------------+---------------------+
| 2011-05-26 13:20:55 | 2011-05-25 13:20:55 |
+---------------------+---------------------+

您可以任意添加和减去它们,这就是为什么我从来不考虑日期/时间加/减/转换函数的原因。

代码语言:javascript
运行
复制
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 |
+---------------------+---------------------+

你可以使用负数(负时区偏移应该很好)-这些是相同的:

代码语言:javascript
运行
复制
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 |
+---------------------+---------------------+
票数 36
EN

Stack Overflow用户

发布于 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程序中。下面是一个例子。

代码语言:javascript
运行
复制
shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

注意:上面的命令假设"mysql_tzinfo_to_sql“和"mysql”在您的路径中。如果没有,则需要在运行命令时向两者提供完整的路径,或者切换到mysql bin文件夹中,并使用如下命令:

代码语言:javascript
运行
复制
shell> ./mysql_tzinfo_to_sql /usr/share/zoneinfo | ./mysql -u root mysql
票数 29
EN

Stack Overflow用户

发布于 2010-09-13 17:53:50

Q1:是的,CONVERT_TZ为您考虑了夏时制。此信息和每个时区的DST启动/结束时间存储在time_zone_*表中。

Q2:是的,正如mysql文档中所述,时区信息随每个区域的政治变化而变化。每次发生更改时,都必须更新time_zone_*表。有时候真是糟透了,这就是其中之一。

Q3:这些是5个时区表,查询它们是否包含任何内容:

代码语言:javascript
运行
复制
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;
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2523286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档