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

SQL temporal table: It is possible to change logging time from UTC to current time?

我喜欢 SQL Server 2016 中的临时 tables,我想在新项目中使用它。 不幸的是,sql 似乎在历史 table 中记录 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

不是。来自 Temporal Table Usage Scenarios:

System-versioned temporal tables store values for period columns in UTC time zone, while it is always more convenient to work with local time zone both for filtering data and displaying results. The following code example shows how to apply filtering condition that is originally specified in the local time zone ...

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

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