[SQL SERVER][Memo]全時區轉換

[SQL SERVER][Memo]全時區轉換

假設你的應用程式是跨國(如跨國銀行交易)使用的話,

那麼資料庫一些國際化特性支持可說相當重要,

其中最常見的就是各國時區上的差異。

由於SQL Server getdate() 是擷取執行個體電腦所返回的值,

所以並不包含資料庫時區位移,

但SQL2008後新增了 datetimeoffset  資料類型(結合時區為基礎的當日時間),

且可搭配 SWITCHOFFSET Function 來更方便處理時區轉換需求,

下面自己筆記一下(個人認為在AP端處理應該可以更方便 TimeZoneInfo Class)。

 


--時區轉換
SELECT SYSDATETIMEOFFSET() as "Taipei (GMT +8:00)",
SWITCHOFFSET(SYSDATETIMEOFFSET(), '+09:00') as "Janpen (GMT +9:00)",
SWITCHOFFSET(SYSDATETIMEOFFSET(), '-10:00') as "Hawaii (GMT -10:00)"

 


image 

如果使用SQL2005早期版本可參考 SQL 2005 Time Zone Conversion Functions 




--取得Taipei時區位移
select DATEDIFF(MI, SYSDATETIMEOFFSET(),getdate()) as 'TimeZoneOffset'

image 

480 min /60 min=8 hr





--讀取作業系統登錄檔取得GMT和DST名稱
DECLARE @GMTname VARCHAR(100),@DSTname VARCHAR(100); 
EXEC xp_regread "HKEY_LOCAL_MACHINE","System\CurrentControlSet\Control\TimeZoneInformation","StandardName",@GMTname OUTPUT 
EXEC xp_regread "HKEY_LOCAL_MACHINE","System\CurrentControlSet\Control\TimeZoneInformation","DaylightName",@DSTname OUTPUT 
SELECT @GMTname as '格林威治標準時間(GMT: Greenwich Mean Time )',@DSTname as '夏令時間(DST: Daylight Saving Time )'

 


image 

 

 

參考

GETDATE (Transact-SQL)

datetimeoffset (Transact-SQL)

SWITCHOFFSET (Transact-SQL)

[SQL SERVER][TSQL]日期和時間函數

Using time zone data in SQL Server 2008

SQL 2005 Time Zone Conversion Functions

time zone conversion function (SQL 2008)

http://time.artjoey.com/

時區列表