双时态SQL表查询

问题描述

我正在尝试对sql表进行建模以存储员工的薪水变化。一种方法是使用双向表,如下所示:

Bitemporal table

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

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

  • 在薪水审查=老薪水之后的那一刻,他在2015年12月的薪水是多少
  • 他在2016年1月2日的薪水是多少,然后他接受了审查=旧薪水(因为员工还不知道加薪)
  • 在他接受审核=新工资之后,他在2016年1月2日的工资是多少(因为员工现在知道加薪了)

似乎我有两个变量:有效的和稳定的。但是,我正在努力提出一种能够产生正确结果的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查询,该查询在所有情况下都有效,并且每次都只产生一个结果行。 任何帮助是极大的赞赏。 餐桌设计上的任何改进都一样。

解决方法

经过进一步调查,我确定我的SQL查询确实正确。但是,对于完全双时态的情况,我在数据库中缺少几行。 数据库的外观如下:

bi-temporal