2012-07-17 72 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