在Azure上面的PaaS時間都是以UTC時間為准(雲的世界里基本上都是以UTC時間為標准的),所以以前在本地SQL Server上面常用的GetDate()方法會碰到問題,在中國獲取的時間會被當前時間少了8個小時,因為Azure上的時間都是UTC之間,中國的時區是+8.所以你通過GetDate()獲取的時間少了8個小時是正常的。但是碰到這個問題有什么好辦法可以解決呢?怎樣才能獲取帶上時區偏移之后的時間呢?。在Azure SQL Database上面是沒有辦法直接通過設置某個參數或者變量就可以解決的。不過SQL Database V12之后開始支持SQL Server 2016才支持的一個新的語法:AT Time Zone
inputdate AT TIME ZONE timezone
- inputdate
-
Is an expression that can be resolved to a smalldatetime, datetime, datetime2, or datetimeoffset value.
- timezone
-
Name of the destination time zone. SQL Server relies on time zones that are stored in the Windows Registry. All time zones installed on the computer are stored in the following registry hive: KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones. A list of installed time zones is also exposed through the sys.time_zone_info (Transact-SQL) view.
-
有了這個新的語法之后我們解決這個時區的問題就容易一些了。
-
假設我們有一張表appcount有兩個字段一個是自增長字段id,和另外一個字段是日期型字段Createdate
-
CREATE TABLE [dbo].[appcount](
[Id] [int] IDENTITY(1,1) NOT NULL,
[createtime] [datetime] NULL,
PRIMARY KEY CLUSTERED (Id)
)通常我們往這個表里面插進去一條數據時會用下面這個語句:
INSERT INTO appcount(createtime) VALUES(getdate())
用來標記着這條記錄的創建時間是當前時間的,但是直接在Azure SQL Database上面執行出來會變成這個結果:
-
如果我們在顯示這個記錄創建時間的時候不帶上Time Zone相關的處理,時間就跟當前時間對不上號了。
-
如果要獲取到當前時區的時間的話,我們可以將GetDate()這個方法稍微改一下
-
INSERT INTO appcount(createtime) VALUES(CONVERT(DATETIME,SYSDATETIMEOFFSET() AT TIME ZONE 'China Standard Time'))
從圖里我們會發現時間變回了我們想要的本地時間了
注意:因為AT Time Zone語法是Azure SQL Database V12的功能,所以如果你的數據庫不是V12版本的話是不支持這個語法的,你執行語句是會拋出下面的錯誤
老版本的的Azure SQL Datbase解決辦法可以參考下面這個博客,通過自定義函數來解決
http://wely-lau.net/2011/07/10/managing-timezone-in-sql-azure-2/



