【问题标题】:SQL - compare dates with different time zonesSQL - 比较不同时区的日期
【发布时间】:2012-07-17 14:05:40
【问题描述】:

我的MySQL 数据库中有一个字段,其中包含具有以下格式的时区日期:1986-07-10T00:00:00.000+02:001986-07-10T00:00:00.000Z(Z 表示祖鲁时间,或UTC)。

我正在尝试编写一个 WHERE 子句来检查现在(我的时区 = Europe/Brussels)和日期字段之间的差异是否大于例如18年。有什么方法可以让我只使用SQL 来完成这项工作吗?

我正在阅读一个名为 CONVERT_TZ() 的函数,但我不确定我的方向是否正确。

【问题讨论】:

  • mysql字段是什么数据类型?

标签: mysql date convert-tz


【解决方案1】:

要将时间转换为您的时区,您可以执行以下操作:

CONVERT_TZ(
   REPLACE(
      SUBSTRING(date, 1, 19), # '1986-07-10T00:00:00' .000+02:00
      'T',
      ' '
      ),
   IF(
      SUBSTRING(date, 24) = 'Z',
      '+00:00',
      SUBSTRING(date, 24) # 1986-07-10T00:00:00.000 '+02:00'
      ),
   'Europe/Brussels'
   )

mysql 手册中的注释
要使用命名时区,例如“MET”或“Europe/Moscow”,必须正确设置时区表。有关说明,请参阅Section 10.6, “MySQL Server Time Zone Support”

更新示例
如果表包含: SELECT * FROM so_peter;

+-------------------------------+
| tzdate                        |
+-------------------------------+
| 1986-07-10T00:00:00.000+02:00 |
| 1986-07-10T00:00:00.000Z      |
| 2012-07-18T00:00:00.000+07:00 |
+-------------------------------+

这个查询的结果是:

SELECT tzdate FROM so_peter 
WHERE CONVERT_TZ(REPLACE(SUBSTRING(tzdate, 1, 19), 'T', ' '), IF(SUBSTRING(tzdate, 24) = 'Z', '+00:00', SUBSTRING(tzdate, 24)), 'Europe/Brussels')
   > '1986-07-10 01:00:00';
+-------------------------------+
| tzdate                        |
+-------------------------------+
| 1986-07-10T00:00:00.000Z      |
| 2012-07-18T00:00:00.000+07:00 |
+-------------------------------+

【讨论】:

  • 感谢您的回复,但这似乎不起作用。我收到语法错误。另外,如何在 WHERE 子句中使用它?
  • sorry, if 前面的, 漏掉了,后面加个例子,先在数据库里试试吧:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 2016-04-14
  • 1970-01-01
相关资源
最近更新 更多