2017-08-14 11 views
0

我使用datetime在數據庫中將用戶保存的日期保存爲UTC_TIMESTAMP()
例如:CreatedDate datetime,如何在MySQL中以正確的方式處理存儲的UTC日期轉換(夏令時)?

我知道bellow會返回正確的結果。

select convert_tz(utc_timestamp(),'+00:00',@@session.time_zone); 

我懷疑是舊數據是需要檢查涉及在日光節約與否。之後做適當的計算這是我的主要疑問。是否需要。請解釋清楚嗎?

實施例:

select case when (month(utc_timestamp())<6 and month(CreatedDate)<6) or 
        (month(utc_timestamp())>6 and month(CreatedDate)>6)) 
       then convert_tz(CreatedDate ,'+00:00',@@session.time_zone) 
      when (month(utc_timestamp())<6 and month(CreatedDate)>6) then 
         convert_tz(CreatedDate,'+00:00',@@session.time_zone) 
        -- require to decrease the @@session.time_zone with 1 hour 
      else convert_tz(CreatedDate,'+00:00',@@session.time_zone) 
        -- require to increase the @@session.time_zone with 1 hour 
     end as CreatedDate 
from tbluser; 



爲了報告目的,我使用@@session.time_zone否則我會給CreatedDate(無需轉換)到前端顯影劑。但是我仍然懷疑是否還需要檢查夏令時並轉換爲舊數據?

上述查詢有錯誤,但我要求的邏輯。

回答

1

mysql documentation

時區值可以在多種格式,其中沒有一個是大小寫敏感給出:

  • 'SYSTEM'指示時區應與系統時區 相同。

  • 該值可以以字符串的形式給出,指示與UTC的偏移量,例如 可以是'+10:00''-6:00'

  • 的值可以被給定爲指定的時間區,如 'Europe/Helsinki''US/Eastern',或'MET'。命名時區可以是 ,只有在創建並填充了mysql數據庫 中的時區信息表時才使用。

如果您@@session.time_zone要麼在第一或第三種形式,則DST已經被考慮在內。

在第二種形式中,你只有一個固定的UTC偏移量,所以你不能真的假設任何DST適用。即使你可以,它肯定也不會遵循你所寫的邏輯。請記住,DST不適用於整個世界,對於那些使用它的人來說,國家之間的開始和結束日期和時間有所不同。

因此,你應該不是寫任何自定義的DST調整。請讓convert_tz完成工作。

相關問題