2012-07-17 120 views
1

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

我想编写一个WHERE子句,检查NOW(我的时区= Europe/Brussels)和日期字段之间的差异是否大于等于18年。有没有什么办法可以用SQL来完成?

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

+0

什么数据类型是MySQL的领域呢? – 2012-07-17 14:10:41

+0

数据类型是varchar – Peter 2012-07-17 14:18:05

回答

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手册
使用命名的时区,如“符合”或“欧洲/莫斯科,时区表必须正确设置。见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 | 
+-------------------------------+ 
+0

感谢您的回复,但这似乎不起作用。我得到语法错误。另外,如何在WHERE子句中使用它? – Peter 2012-07-17 15:09:55

+0

对不起,错过了','就在if之前,马上添加一个例子,只需要先在数据库中试一试:-) – 2012-07-17 15:15:17