我在我的數據庫表中有一列UNIX時間戳,它來自科威特時區的系統。在sql server中從時區到時區的日期時間轉換
我的數據庫服務器的時區爲Eastern Time US & Canada
。現在我需要使用SQL查詢將UNIX時間戳轉換爲科威特時區日期值。
誰能告訴我如何將這個UNIX時間戳轉換爲科威特時區日期值?
我在我的數據庫表中有一列UNIX時間戳,它來自科威特時區的系統。在sql server中從時區到時區的日期時間轉換
我的數據庫服務器的時區爲Eastern Time US & Canada
。現在我需要使用SQL查詢將UNIX時間戳轉換爲科威特時區日期值。
誰能告訴我如何將這個UNIX時間戳轉換爲科威特時區日期值?
Unix時間戳是自1970年1月1日UTC以來的整數秒數。
假設你的意思是你的數據庫中有一個整數列,那麼你的數據庫服務器的時區是不相關的。
首先時間戳轉換爲datetime
類型:
SELECT DATEADD(second, yourTimeStamp, '1970-01-01')
這將是對應於您的時間戳UTC datetime
。
然後你需要知道如何調整這個值到你的目標時區。在世界的大部分地區,由於夏令時,單個區域可能有多個偏移量。
不幸的是,SQL Server無法直接處理工作時區。因此,如果你是美國太平洋時間,你就無法知道你是否應該減去7小時或8小時。其他數據庫(Oracle,Postgres,MySql等)都有內置的方法來處理這個問題,但是,SQL Server卻沒有。所以,如果你正在尋找一個通用的解決方案,你需要做以下之一:
導入時區數據到一個表,並維持該表的時區規則的改變。使用該表與一堆自定義邏輯來解決特定日期的偏移量。
使用xp_regread
獲取包含時區數據的Windows註冊表項,並再次使用一堆定製邏輯來解析特定日期的偏移量。當然,xp_regread
是一件壞事,需要授予某些權限,並且不受支持或文檔。
編寫一個在.Net中使用TimeZoneInfo
類的SQLCLR函數。不幸的是,這個requires an "unsafe" SQLCLR assembly,並可能導致不好的事情發生。
恕我直言,這些方法都沒有的都非常好,並沒有很好的解決方案,直接在SQL這樣做。最好的解決方案是將UTC值(原始整數或UTC上的datetime
)返回到您的調用應用程序代碼,並在那裏進行時區轉換(例如,使用.Net中的TimeZoneInfo
或其他類似機制平臺)。
然而,你已經幸運地出現在科威特(而且一直是)在不改變夏令時的地區。它始終是UTC + 03:00。所以,你可以簡單地添加三個小時,返回結果:
SELECT DATEADD(hour, 3, DATEADD(second, yourTimeStamp, '1970-01-01'))
但不要認識到這是不是一個通用的解決方案,在任何時區工作。
如果您想要,您可以返回其他SQL數據類型之一,例如datetimeoffset
,但這隻會幫助您反映該值爲三個小時的時間偏移量,可供任何人查看。它不會使轉換過程有任何不同或更好。
更新回答
我已經創建了一個項目在SQL Server的支持時區。您可以安裝它from here。然後,你可以簡單地轉換,像這樣:
SELECT Tzdb.UtcToLocal('2015-07-01 00:00:00', 'Asia/Kuwait')
您可以使用any time zone from the IANA tz database,包括那些使用夏令時。
您仍然可以使用上面顯示的方法從unix時間戳轉換。把他們兩個在一起:
SELECT Tzdb.UtcToLocal(DATEADD(second, yourTimeStamp, '1970-01-01'), 'Asia/Kuwait')
再次
更新在SQL Server 2016年,現在有內置的支持與AT TIME ZONE
發言時區。這在Azure SQL數據庫(v12)中也可用。
SELECT DATEADD(second, yourTimeStamp, '1970-01-01') AT TIME ZONE 'Arab Standard Time'
我使用此查詢,它爲我工作。 SELECT CAST(SWITCHOFFSET(CAST(dateadd(s,1356052117,'01/01/2070')AS datetimeoffset)'+03:00')AS DATETIME)AS [Date] –
那麼,切換偏移量是好的 - 如果您要在應用程序中使用DateTimeOffset。但是如果你只是回到'日期時間',那麼沒有真正的附加好處。你可能只需要增加3個小時。 –
另外 - 我看到你最終在鑄造'日期'。這將截斷任何時間組件。除非這是你想要的,否則你應該改用'datetime'。 –