在Azure上面的PaaS時間都是以UTC時間為準(雲的世界里基本上都是以UTC時間為標準的),所以以前在本地SQL Server上面常用的GetDate()方法會碰到問題,在中國獲取的時間會被當前時間少了8個小時,因為Azure上的時間都是UTC之間,中國的時區是+8.所以你通過GetDate()
在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/