2016-09-21 90 views
1

我喜欢SQL Server 2016中的时态表,我想在新项目中使用它。 不幸的是,似乎sql在历史表中记录UTC时间,而不是当前时间。有可能改变这一点?SQL时态表:可以更改从UTC到当前时间的记录时间?

要明白我的意思,请运行以下代码并注意与CreatedIn和SysStartTime列的区别。

CREATE TABLE dbo.tblTest 
( 
    ID int NOT NULL PRIMARY KEY CLUSTERED IDENTITY (1,1) 
    ,SomeColumn varchar(50) NULL 
    ,CreatedIn datetime2(2) NOT NULL DEFAULT GETDATE() 
    ,SysStartTime datetime2(2) GENERATED ALWAYS AS ROW START NOT NULL DEFAULT GETDATE() 
    ,SysEndTime datetime2(2) GENERATED ALWAYS AS ROW END NOT NULL 
    ,PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)  
) 
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.tblTestHistory)); 
GO 

INSERT INTO dbo.tblTest (SomeColumn) VALUES ('Some value'); 
GO 

SELECT * FROM dbo.tblTest 
+3

你在你的时区观察到DST吗?如果是这样,你真的想介绍一下模棱两可的历史吗? –

+0

@Damien_The_Unbeliever:我明白你的意思了,但事实并非如此。只有一台服务器,所有用户都在同一个区域。如果所有历史记录表都使用当前时间而不是UTC记录更改,则不会看到任何问题。 – adiw

+0

您或您是否没有在该时区观察夏令时? –

回答

4

它不是。来自Temporal Table Usage Scenarios

系统版本化时态表存储UTC时区中时间段的值,而使用本地时区处理数据和显示结果总是更方便。下面的代码示例演示如何应用在本地时区最初指定过滤条件...

你会发现,他们不说,它默认到存储UTC。他们表示,它确实存储UTC。但它们确实提供了一个如何使用新的AT TIME ZONE功能来调整查询的示例。

+0

谢谢达米安,我没注意到。我的错。 – adiw

0

我创建了一个UDF来处理这对我来说

CREATE FUNCTION [dbo].[udfGetLocalDateTime](@StartDate datetime) 
RETURNS datetime 
AS 
BEGIN 
RETURN (dateadd(hour,(cast(datepart(hour,sysdatetime()) as int) - 
cast(datepart(hour,sysutcdatetime()) as int)),@startdate)) 
END 

这需要你的服务器的日期和减去UTC时间获取本地时间偏移量,然后应用于的源日期。您可以将其用于开始日期或结束日期,并且它应该支持夏令时,因为它基于您当前的服务器时间。