【问题标题】:CONTAINED IN (@start, @end) VS BETWEEN - temporal tables包含在(@start,@end)VS BETWEEN - 临时表中
【发布时间】:2018-08-27 11:28:19
【问题描述】:

Temporal TablesSQL Server 2016 及更高版本的新功能,它就像SQL Server 自动将历史数据保存在表中的一种有趣方式,但是有一些新的T- SQL Server 2016 中引入的 SQL 语法以支持临时表。我对他们中的一些人有误解。

来自official documentationBETWEEN <start_date_time> AND <end_date_time>的描述如下:

FOR SYSTEM_TIME FROM TO 同上 描述,返回的行表除外 包括在由 端点。

CONTAINED IN (<start_date_time>, <end_date_time>)的描述如下:-

返回一个表,其中包含已打开的所有行版本的值 并在两个日期时间定义的指定时间范围内关闭 CONTAINED IN 参数的值。准确激活的行 在下边界上或在上边界上停止活动 包括边界。

所以我理解,CONTAINED IN (@start,@end)BETWEEN 子句之间的唯一区别是 CONTAINED IN (@start, @end) 包含 @start 边界,而 BETWEEN 子句不包含。我说的对吗?

【问题讨论】:

  • 你问@Start边界是否包含在BETWEEN子句中?
  • 不,我知道@Start 不包括在内。我在问下一个陈述是否正确? CONTAINED IN 的返回结果与 BETWEEN 相同,只是 CONTAINED IN 包含在 @Start 边界中,而 BETWEEN 不包含 对吗?谢谢。
  • 你只是回答你的问题,两种情况下的结果会有所不同。
  • 我在问这是唯一的区别吗?
  • CONTAINED IN 仅返回存在于指定期间边界内的那些。如果您只搜索非当前行版本,CONTAINED IN 将是最佳选择,因为它仅适用于历史表并且会产生最佳查询性能。

标签: sql-server sql-server-2016 temporal-tables


【解决方案1】:

this 文章中,@Ameena Lalani 解释和演示了搜索时态表的各种选项,解释得非常好,请务必阅读整篇文章。

简单总结一下:

  • FROM <start_datetime> TO <end_datetime>
    返回结合时间和历史表的结果,不包括结束时间的上限。
  • BETWEEN <start_datetime> AND <end_datetime>
    返回时态表和历史表的组合结果,包括结束时间的上限。
  • CONTAINED IN (start_datetime, end_datetime)
    仅返回历史表中的结果,包括时间的上限和下限。

这是从那篇文章中截取的截图:

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 2016-12-05
    • 2021-07-04
    • 2019-08-08
    • 2019-09-07
    • 2017-10-29
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    相关资源
    最近更新 更多