如何在MySql选择查询中将UTC日期转换为本地时区

问题描述 投票:0回答:4

我在 MySql 数据库的一个查询中使用此 Where 条件。我的问题是我的表中有一个显示时间列,但该表列显示 UTC 时间中的数据。我想将该显示时间列转换为本地时区。那么我如何从查询本身提供此功能。

我仔细观察了这些东西,我知道像

SELECT CONVERT_TZ()
这样的东西会起作用。但它对我不起作用。

这是我的查询,我需要将显示时间转换为本地时区...有人可以指导我吗?

WHERE displaytime >= '2012-12-01 00:00:00'
  AND displaytime <='2013-02-22 23:59:59'
  AND ct.organizationId IN (
    SELECT t.organizationId
      FROM organization_ AS t
      JOIN organization_ AS p ON t.treePath LIKE CONCAT(p.treePath, '%')
     WHERE p.organizationId = 10707

enter image description here 样本数据

enter image description here

mysql utc localtime convert-tz
4个回答
138
投票

SELECT CONVERT_TZ() 可以做到这一点。但它不适合我。

为什么,你得到了什么错误?

SELECT CONVERT_TZ(displaytime,'GMT','MET');
如果您的列类型是时间戳或日期,

应该可以工作

http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_convert-tz

测试其工作原理:

SELECT CONVERT_TZ(a_ad_display.displaytime,'+00:00','+04:00');

检查您的时区表

SELECT * FROM mysql.time_zone;
SELECT * FROM mysql.time_zone_name;

http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html

如果这些表为空,则表明您尚未初始化时区表。根据上面的链接,您可以使用

mysql_tzinfo_to_sql
程序加载时区表。请尝试这个

shell> mysql_tzinfo_to_sql /usr/share/zoneinfo

或者如果不起作用,请阅读更多内容:http://dev.mysql.com/doc/refman/5.5/en/mysql-tzinfo-to-sql.html


31
投票

就我而言,时区在服务器上不可用,这非常有效:

SELECT CONVERT_TZ(`date_field`,'+00:00',@@global.time_zone) FROM `table`

注意:global.time_zone 使用服务器时区。您必须确保它具有所需的时区!


17
投票
 select convert_tz(now(),@@session.time_zone,'+05:30')

将“+05:30”替换为所需的时区。请参阅此处 - https://stackoverflow.com/a/3984412/2359994

格式化为所需的时间格式,例如:

 select DATE_FORMAT(convert_tz(now(),@@session.time_zone,'+05:30') ,'%b %d %Y %h:%i:%s %p') 

你会得到类似的结果 -> Dec 17 2014 10:39:56 AM


0
投票

使用“CST”和“EST”等 3 字符时区的工作不一致(例如,我的

mysql.time_zone_name
有“EST”但没有“CST”)。要查看可用的内容:

> SELECT * FROM mysql.time_zone_name where name like 'us/%';
+-------------------+--------------+
| Name              | Time_zone_id |
|-------------------+--------------|
| US/Alaska         | 580          |
| US/Aleutian       | 581          |
| US/Arizona        | 582          |
| US/Central        | 583          |
| US/East-Indiana   | 584          |
| US/Eastern        | 585          |
| US/Hawaii         | 586          |
| US/Indiana-Starke | 587          |
| US/Michigan       | 588          |
| US/Mountain       | 589          |
| US/Pacific        | 590          |
| US/Samoa          | 591          |
+-------------------+--------------+

然后使用第二个参数的“名称”值:

select convert_tz(insert_timestamp,'UTC','US/Central') from table;

这种方法比硬编码 UTC 的数字偏移效果更好,因为该数字会根据夏令时是否生效而变化。

© www.soinside.com 2019 - 2024. All rights reserved.