Sql-Server
SQL 臨時表開始和結束日期
我們想在 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,那麼這應該滿足您的要求。