Sql-Server

SQL 臨時表開始和結束日期

  • October 11, 2018

我們想在 SQL Server 2016 中實現時態表。我們正在創建一個數據倉庫並開發類型 2 漸變維度表。

對於我們的 BeginDate 和 EndDate,我們希望它們是日期,而不是日期時間。總是在日期的開始。因此,如果表在 2018 年 5 月 3 日下午 2:30 發生更改,SQL 臨時表將自動放置日期時間,但是,我們只需要 2018 年 5 月 3 日的日期。無論如何只實現日期,而不使用視圖(將日期時間轉換為日期),並且不修改/更新時間歷史表?是否有僅使用正常日期的屬性或設置?如果沒有其他選擇,這兩者中最好的是視圖還是更新時間歷史表?

CREATE TABLE dbo.Department
(
   DeptID INT NOT NULL PRIMARY KEY CLUSTERED,
   DeptName VARCHAR(50) NOT NULL,
   ManagerID INT NULL,
   ParentDeptID INT NULL,
   SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START
     CONSTRAINT DF_Department_SysStartTime DEFAULT SYSUTCDATETIME() NOT NULL,
   SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END
     CONSTRAINT DF_Department_SysEndTime 
   DEFAULT CONVERT( DATETIME2, '9999-12-31 23:59:59' ) NOT NULL,
   PERIOD FOR SYSTEM_TIME(SysStartTime, SysEndTime)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory));

由於您只想使用 DATE 值來確定您的歷史更改,我假設數據每天只會更新一次,否則您可能會有多個具有相同日期值的歷史條目,您無法辨識訂單只有一個 DATE 值。

鑑於此假設,您可以通過查詢表和歷史表僅依賴 SysStartTime 來獲取開始和結束資訊。為此,如果您向表中添加計算列,如下所示:

CREATE TABLE dbo.Department
(
   DeptID INT NOT NULL PRIMARY KEY CLUSTERED,
   DeptName VARCHAR(50) NOT NULL,
   ManagerID INT NULL,
   ParentDeptID INT NULL,
   SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START
     CONSTRAINT DF_Department_SysStartTime DEFAULT SYSUTCDATETIME() NOT NULL,
   ValidFromDate AS CAST(SysStartTime AS DATE), -- This is a computed column
   SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END
     CONSTRAINT DF_Department_SysEndTime 
   DEFAULT CONVERT( DATETIME2, '9999-12-31 23:59:59' ) NOT NULL,
   PERIOD FOR SYSTEM_TIME(SysStartTime, SysEndTime)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory));

您的歷史記錄表沒有計算出的列,而是在記錄發生任何更改時保留該值。這對 SysEndTime 不起作用,因為它不會在系統版本更改時重新計算該值,因此它始終是 9999-12-31。

對Department的查詢將返回計算值,即轉換為日期的 SysStartTime datetime2 值,對DepartmentHistory的查詢將返回持久值,該值是計算值,因為它在版本化時(即 SysStartTime datetime2值轉換為日期)。

如果您的 Type 2 SCD 只能依賴 SysStartTime,那麼這應該滿足您的要求。

引用自:https://dba.stackexchange.com/questions/219808