SQL时态表:可以将记录时间从UTC更改为当前时间吗?

时间:2016-09-21 09:06:56

标签: sql sql-server temporal

我喜欢SQL Server 2016中的时态表,我想在新项目中使用它。 不幸的是,似乎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

2 个答案:

答案 0 :(得分:4)

不是。来自Temporal Table Usage Scenarios

  

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

您会注意到他们没有说默认来存储UTC。他们声明 存储UTC。但他们确实提供了一个使用新的AT TIME ZONE功能来调整查询的示例。

答案 1 :(得分:3)

我创建了一个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时间以获取本地时间偏移,然后将其应用于源日期。您可以将此用于开始日期或结束日期,并且它应该支持夏令时,因为它基于您当前的服务器时间。