【问题标题】:mysql Query Timezone conversionmysql查询时区转换
【发布时间】:2012-05-08 12:23:29
【问题描述】:

我已将显示时间全部存储在时区设置表中的东部和 ID 中。时区设置表包含 Timezone_id、GMT 偏移量和时区名称。

GMT 偏移量存储为 +6、-4、+3.5、-4.5 等。

我正在尝试编写一个查询以将放映时间转换为原始时区。我就是这样做的。

SELECT Date_format( CONVERT_TZ( CONVERT_TZ(A.START_TIME,  '+00:00',  '-5:00'),  
'+00:00',     CONCAT(B.GMT_OFFSET , ':00' )), '%Y-%m-%e %r:%i')  
AS  'start_time' from shows A, tz_settings B AND <<JOINS>>;

我在这里做的是首先将时间从 ET 转换为 GMT,然后应用 GMT 偏移量。

START_TIME 的日期格式类似于“2012-4-23 10:15:00” 此外,还有一个问题是将“3.5”等格式转换为“3.30”以传递给 Convert_TZ

编辑:表结构。主要领域。

   shows: 'id', 'show_name', 'stat_time', 'tz_id'
   tz_settings: 'tz_id', 'gmt_offset','tz_name'

有什么想法吗?任何其他功能会有所帮助吗?

【问题讨论】:

  • 您能否发布您的表格结构以更好地理解您在做什么?
  • 刚刚添加了两张表的基本结构。
  • 我无法理解的一件事,如果您从 ET 转换为 GMT,为什么要从该转换中排除 ET 中的转换?既然你说所有的人都在外星人? (或者我读错了你的问题?)
  • 你是对的。我可能夸大了。现在更新我的问题。
  • 这让我出汗了 :) 很高兴我能帮上忙。

标签: php mysql timezone conventions convert-tz


【解决方案1】:

真的不知道你遇到了什么问题,但我只是用你的结构构建了 2 个 MYSQL 表:

MySQL 表

TABLE shows ['id', 'show_name', 'start_time', 'tz_id']
TABLE tz_settings ['tz_id', 'gmt_offset','tz_name']

还有这个 MySQL 查询:

SELECT Date_format( CONVERT_TZ( CONVERT_TZ( A.START_TIME, '+00:00', '-5:00' ) , '+00:00', CONCAT( B.GMT_OFFSET, ':00' ) ) , '%Y-%m-%e %r:%i' ) AS 'start_time'
FROM shows A, tz_settings B
WHERE A.id =1
AND B.tz_id = A.tz_id

结果如预期!


无论如何,您应该以完整格式存储 GMT OFFSET 以简化查询,从而丢失 CONCAT 并提高性能。 例如:而不是 +5,存储 +05:00

这对你有什么帮助吗?


已编辑以包含 MYSQL IF 和替换

SELECT Date_format( CONVERT_TZ( CONVERT_TZ( A.STAT_TIME, '+00:00', '-5:00' ) , '+00:00', if( B.GMT_OFFSET LIKE '%.5', REPLACE( B.GMT_OFFSET, '.5', ':30' ) , CONCAT( B.GMT_OFFSET, ':00' ) ) ) , '%Y-%m-%e %r:%i' ) AS 'start_time'
FROM shows A, tz_settings B
WHERE A.`id` =1
AND B.`tz_id` = A.`tz_id`

因此,如果存储的 GMT OFFSET 为 0.5,它将被替换为 :30,否则,它将附加 :00 到现有值。 (经过测试,按预期返回值)

【讨论】:

  • 这就是问题所在。正如您从我的问题中看到的那样,GMT 偏移量存储为 +3.5、+6、+4.5 等。+6 很好。但是我们如何处理 +4.5(应该是 +4:30)?
  • 但是您无法控制存储的 GMT 偏移量?你的意思是:4.5 应该是 4:30?
  • 不确定“但您无法控制存储的 GMT 偏移量?”是什么意思。但我现在无法更改这种格式。至于第二个问题。 Convert_TZ 采用“(+/-)00:00”形式的第三个参数。所以我不能在这里通过 4.5,而我可以通过 +6 作为“+6:00”。
  • 好的,所以你不能以正确的格式存储 GMT OFFSET,你需要处理像“+4.5”这样的存储值,然后使用“+4:50”!是这样吗? (请确认,在我编辑答案之前)
  • 对。除了“as +4:50”应该是“as +4:30”。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 2019-07-29
相关资源
最近更新 更多