2016-09-21 93 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時間獲取本地時間偏移量,然後應用於的源日期。您可以將其用於開始日期或結束日期,並且它應該支持夏令時,因爲它基於您當前的服務器時間。