SQL - 比较具有不同时区的日期

时间:2012-07-17 14:05:41

标签: mysql date convert-tz

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

我正在尝试撰写一个WHERE子句,用于检查NOW(我的时区= Europe/Brussels)与日期字段之间的差异是否大于例如18年。有没有办法只用SQL来完成这个?

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

1 个答案:

答案 0 :(得分:0)

将时间转换为您的时区,您可以做类似的事情:

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 |
+-------------------------------+