2008-10-15 38 views
2

我有一個數據庫,其中包含當前存儲在本地時間的日期時間字段。即將到來的項目將要求將所有這些日期轉換爲世界時。我寧願使用可用的sqlserver/sql功能將這些日期準​​確地轉換爲通用時間,而不是編寫一個c#應用程序來將這些時間轉換爲世界時,所以我只需要更新腳本。爲了準確,轉換需要考慮夏令時波動等。如何使用SQL將SqlServer日期時間轉換爲通用時間

回答

0

一個用戶定義函數會允許你寫一個SQL查詢,看起來像這樣:

SELECT toUTC([MyDateColumn], [MyTimeZoneColumn]) FROM [MyTable] 

然後你得到普遍次從服務器返回的查詢中不包含本身有很多醜陋的語法。現在,您可以使用類似於Chris發佈的常規SQL來構建UDF,但SQL Server 2005和更高版本將允許您使用CLR(.Net:C#可選)構建UDF。它具有更好的日期支持,並可以在考慮時區和夏時制方面做得更好。

0

SQL沒有爲此內置任何內容。

兩種方式將是C# application(你提到你不想)或類似的東西寫一個非常複雜的更新語句:

UtcDate = DATEADD(hour, CASE WHEN OriginalDate BETWEEN x AND y THEN 4 
WHEN OriginalDate BETWEEN x2 AND y2 THEN 5 ... END, OriginalDate) 

注 - 我建議C# app加上像TZ4Net東西處理轉換。

0

退房this link from CodeProject.com - 它正是你想要的:取日期和時區,將它們傳遞到一個UDF,並獲得UTC日期或任何其它時區。

重要提示:請檢查該文章的評論 - 作者在某個時間點之後不允許修改文章,並且在解決某些未找到問題的評論中有用於UDF的代碼的更新版本在原來的文章代碼中。

同樣重要的:不要用它來查詢大型數據集。對於一次性加載到數據庫或者爲單行返回UTC日期(如用戶登錄表或您擁有的東西),這是完全正確的。

如果您想要性能,唯一真正可以接受的方法是時區轉換應該有一個查找表,它可以處理每年每個小時的每個可能的時區轉換,並使用一個case語句來處理年份之間的轉換(即12月31日 - 1月1日,反之亦然)。是的,表是巨大,但查詢性能爲零。