我在 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
样本数据
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
就我而言,时区在服务器上不可用,这非常有效:
SELECT CONVERT_TZ(`date_field`,'+00:00',@@global.time_zone) FROM `table`
注意:global.time_zone 使用服务器时区。您必须确保它具有所需的时区!
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
使用“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 的数字偏移效果更好,因为该数字会根据夏令时是否生效而变化。