簡體   English   中英

mysql convert_tz在where子句中不起作用

[英]mysql convert_tz not working in where clause

我有一個datetime字段,我試圖用CONVERT_TZBETWEEN日期。 這是一個示例,僅選擇:

SELECT (DATE_FORMAT(CONVERT_TZ(`created_at`,'+00:00','+05:00'), ' %Y-%m-%d')) FROM `pages`

這可以正常工作並返回結果。 但是,當我嘗試在應返回結果的WHERE子句中使用此方法時:

SELECT 
    *
FROM
    `pages`
WHERE
    (DATE_FORMAT(CONVERT_TZ(`created_at`, '+00:00', '+05:00'),
            '%Y-%m-%d')) BETWEEN '2017-05-01' AND '2017-05-30'

這不會返回任何東西。 但是,在日期之間的那些記錄中,有許多記錄應在這些記錄之間進行驗證。

我現在沒有MySQL。 話雖如此,我只想提供一些快速提示:

1) DATE_FORMAT返回一個字符串 ,並且您正在比較WHERE子句中的字符串。 從您的聲譽來看,我絕對可以肯定,您知道在某些情況下,比較數字(或其他數字類型)為字符串不是最明智的事情:-)。

2)如果您想比較考慮到時區的日期時間,則最終應使用也指定時區的常量(在您的情況下,所討論的時間間隔的硬編碼的下端和上端) 。 至少,這對於其他人來說將是一致且易於理解的。

3)請注意, MySQL中的TIMESTAMP字段會將當前時區考慮在內,將插入的數據轉換為UTC,並對讀取的數據執行相反的處理,而DATETIME字段則不這樣做 (您未提及相關字段的類型)。 使用TIMESTAMP字段可能會導致意外結果。

出於這個原因,我從未使用過TIMESTAMP字段(我正在進行時區轉換,通常至少在數據庫軟件外部,這些時區轉換通常與語言環境轉換相關聯,在后端代碼或客戶端代碼中)。 因此,如果比較TIMESTAMP字段,我不知道MySQL的行為。 它是先從字段中提取值,然后將其從UTC轉換為當前時區,然后進行比較,還是基於存儲在字段中的原始(UTC)數據執行比較?

最后一點,您的SELECT語句當然也會以字符串形式返回日期時間,但是在這種情況下,您不會注意到,因為您只查看它們,而不是對其進行計算(或比較)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM