【问题标题】:SQL Server 2016 - Period start and end datetime set manuallySQL Server 2016 - 手动设置期间开始和结束日期时间
【发布时间】:2017-06-14 13:57:07
【问题描述】:

我正在尝试加载一些基于时间的历史数据,我希望它位于 SQL Server 2016 的时态表中。

据我所知,周期开始和结束日期不能手动设置,它们是使用系统时间在插入/更新/删除时间设置的。

但是,我尝试加载的文件具有数据可用的特定日期,我希望将其反映在期间开始日期中,以便我可以相应地进行查询。

有没有办法手动设置周期的开始和结束时间?

【问题讨论】:

标签: sql sql-server temporal temporal-database


【解决方案1】:

您可以通过禁用系统版本控制、输入数据并再次启用系统版本控制来做到这一点。您必须小心不要插入重叠的日期,因为这会使您的历史记录表无法使用。 我发现这在将数据从一个系统迁移到另一个系统时非常有用。

将数据插入主表

首先关闭您的系统版本控制,然后将其完全删除。

ALTER TABLE dbo.ExampleTable SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE dbo.ExampleTable DROP PERIOD FOR SYSTEM_TIME;

-- 插入包含您的开始日期和默认结束日期的数据。

-- 为 system_time 添加您的时间段并启用系统版本控制

ALTER TABLE dbo.ExampleTable ADD PERIOD FOR SYSTEM_TIME(StartDate, EndDate);
ALTER TABLE dbo.ExampleTable SET (SYSTEM_VERSIONING = ON(History_Table = dbo.ExampleTableHistory));

请注意,如果这些列当前被隐藏,这将删除它。

将数据插入您的历史记录表。

对于历史数据,您可以通过关闭系统版本控制并插入数据来直接插入历史表。

ALTER TABLE dbo.ExampleTable SET (SYSTEM_VERSIONING = OFF);

-- 将您的数据插入到 dbo.ExampleTableHistory 表中,包括开始日期和结束日期。

-- 启用系统版本控制

ALTER TABLE dbo.ExampleTable SET (SYSTEM_VERSIONING = ON (History_Table = dbo.ExampleTableHistory)); 

【讨论】:

  • 这是直接在 Microsoft 文档中处理 'oops' 的情况。介绍得很好!
【解决方案2】:

您错过了临时表的要点。系统开始和结束日期仅用于一个目的;提供表中内容和时间的历史记录。您存储数据可用的日期\时间的要求不同。我建议您创建一个列来保存系统列之外的数据。

【讨论】:

  • 请更具体地描述您的答案。
  • 是的,我只是想利用 SSMS 2016 查询功能和时间信息。我最终实现了自己的时间序列模式
【解决方案3】:

您可以使用 sql server management studio 轻松禁用触发器。

  1. 将数据放入临时表中。
  2. 修改数据。
  3. 禁用触发器。
  4. 插入数据。
  5. 启用触发器。

【讨论】: