双时态 SQL table 查询

Bi-temporal SQL table querying

我正在尝试构建一个 SQL table 模型来存储员工的薪水变化。一种方法是使用双时态 table 如下:

此处一名员工于 2015 年 10 月 1 日被雇用,薪水为 100,000。然后在 2016 年 2 月 15 日,他进行了绩效评估,他的老板说,“我们将你的薪水从今年开始(2016 年 1 月 1 日)提高到 110,000。

为了存储此信息,我使用了两组日期范围。 “有效”告诉您薪水何时有效,例如2016 年 1 月 1 日之前为 10 万美元,之后为 11 万美元。另一方面,“已结算”范围表示做出决定的时间,在本例中为 2/15/2016。 因此我应该能够查询以下场景:

看来我有两个变量:effectiveOn 和 settledOn。但是,我正在努力想出一个可以产生正确结果的 SQL 查询。

这是我迄今为止尝试过的方法(并非 适用于所有情况):

SELECT *
FROM Employees 
WHERE (EmployeeId = 10)
 AND 
    (
      ((SettledFrom <= @settledOn) AND (SettledTo IS NULL OR (SettledTo > @settledOn)))
      AND ((EffectiveFrom <= @effectiveOn) AND (EffectiveTo IS NULL OR (EffectiveTo > @effectiveOn)))
    )

理想情况下,我需要一个适用于所有场景并且每次只生成一个结果行的 SQL 查询。 任何帮助是极大的赞赏。 table 设计的任何改进也是如此。

经过进一步调查,我确定我的 SQL 查询确实是正确的。但是,对于完全 bi-temporal 的场景,我在数据库中丢失了几行。 数据库应该是这样的: