【问题标题】:Querying temporal table with date/time fields使用日期/时间字段查询时态表
【发布时间】:2017-10-27 07:43:25
【问题描述】:

我需要使用 SQL Server 2016 中的时态表功能编写查询以获取以下输出。

客户表(系统版本表)

Id
Name
[period_start] [datetime2](7) GENERATED ALWAYS AS ROW START NOT NULL
[period_end] [datetime2](7) GENERATED ALWAYS AS ROW END NOT NULL

订单表

Id
CustomerId
..
[creation_date] DATETIME default SYSUTCDATETIME()

输出:OrderId,...,客户名称

客户名称应反映与订单日期相关的正确名称

以下查询将为我提供所需的输出,但我需要检查这是否是执行此类查询的正确方法..

SELECT T.Id, O.Name
FROM Orders T
INNER JOIN (
SELECT *
FROM Customer 
FOR SYSTEM_TIME FROM '1900-01-01' TO '9999-12-31 23:59:59.9999999'
) O ON T.CustomerId = O.ID 
AND T.creation_date BETWEEN O.period_start AND O.period_end

提前致谢

查明达。

【问题讨论】:

    标签: sql-server temporal-tables


    【解决方案1】:

    我看不出有什么问题,除了嵌套查询可能是不必要的:

    SELECT T.Id, O.Name
    FROM Orders T
    JOIN Customer FOR SYSTEM_TIME FROM '1900-01-01' TO '9999-12-31 23:59:59.9999999' O 
        ON T.CustomerId = O.ID 
    WHERE T.creation_date BETWEEN O.period_start AND O.period_end
    

    【讨论】:

    • 感谢您的回复。我想,硬编码时间段在我的查询中可能不是好事。我想知道他们是否有任何特定的语法来处理这种常见的场景
    • 时态表相对较新(在sql server中),所以周围没有那么多常见的场景。如果这就是您的意思,您可以用变量替换日期。总而言之,我觉得你多虑了。如果某些事情不起作用或变得太慢,请向(自己)提问。
    【解决方案2】:

    您的查询中似乎有多余的条件。我认为这可以满足您的所有要求:

    SELECT T.Id, O.Name
    FROM Orders T INNER JOIN Customer O 
    ON T.CustomerId = O.ID 
    

    【讨论】:

    • 嗨 Wayne,这将始终返回当前客户姓名,而不是下订单的过去姓名。
    • @Cham - Orders 表上是否有客户名称字段?
    猜你喜欢
    • 2018-05-31
    • 2019-08-18
    • 2016-07-09
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2014-06-29
    相关资源
    最近更新 更多