Azure 上SQL Database(PaaS)Time Zone時區問題處理


在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

Syntax

inputdate AT TIME ZONE timezone

Arguments

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上面執行出來會變成這個結果:

image

如果我們在顯示這個記錄創建時間的時候不帶上Time Zone相關的處理,時間就跟當前時間對不上號了。

如果要獲取到當前時區的時間的話,我們可以將GetDate()這個方法稍微改一下

INSERT INTO appcount(createtime) VALUES(CONVERT(DATETIME,SYSDATETIMEOFFSET() AT TIME ZONE 'China Standard Time'))

image

從圖里我們會發現時間變回了我們想要的本地時間了

 

注意:因為AT Time Zone語法是Azure SQL Database V12的功能,所以如果你的數據庫不是V12版本的話是不支持這個語法的,你執行語句是會拋出下面的錯誤

image

 

老版本的的Azure SQL Datbase解決辦法可以參考下面這個博客,通過自定義函數來解決

http://wely-lau.net/2011/07/10/managing-timezone-in-sql-azure-2/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM