SQL ServerAzure 上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上面执行下见面变成这个结果:

SQL Server 1

万一我们在显示是记录创建时间之时不带来齐Time
Zone相关的处理,时间纵和当前时针对莫达标号了。

使要是抱到当前时区的工夫吧,我们可拿GetDate()这个办法有些改变一下

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

SQL Server 2

打图里我们会发现时间变扭了俺们想只要之地面时间了

 

注意:因为AT
Time Zone语法是Azure SQL Database
V12之成效,所以若你的数据库不是V12本的语句是不支持此语法的,你尽语句是会废弃来底的错误

SQL Server 3

 

老版本的之Azure SQL
Datbase解决办法可以参考下面这个博客,通过打定义函数来化解

Managing Timezone in SQL Azure

相关文章