双时态 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。
因此我应该能够查询以下场景:
- 他在 2015 年 12 月的薪水是多少 薪水审查后的那一刻 = 旧薪水
- 2016 年 1 月 2 日他的工资是多少,在他进行审核之前 = 旧工资(因为员工还不知道加薪)
- 他在 2016 年 1 月 2 日的薪水是多少 = 新薪水(因为员工现在知道加薪了)
- 等等
看来我有两个变量: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 的场景,我在数据库中丢失了几行。
数据库应该是这样的:
我正在尝试构建一个 SQL table 模型来存储员工的薪水变化。一种方法是使用双时态 table 如下:
此处一名员工于 2015 年 10 月 1 日被雇用,薪水为 100,000。然后在 2016 年 2 月 15 日,他进行了绩效评估,他的老板说,“我们将你的薪水从今年开始(2016 年 1 月 1 日)提高到 110,000。
为了存储此信息,我使用了两组日期范围。 “有效”告诉您薪水何时有效,例如2016 年 1 月 1 日之前为 10 万美元,之后为 11 万美元。另一方面,“已结算”范围表示做出决定的时间,在本例中为 2/15/2016。 因此我应该能够查询以下场景:
- 他在 2015 年 12 月的薪水是多少 薪水审查后的那一刻 = 旧薪水
- 2016 年 1 月 2 日他的工资是多少,在他进行审核之前 = 旧工资(因为员工还不知道加薪)
- 他在 2016 年 1 月 2 日的薪水是多少 = 新薪水(因为员工现在知道加薪了)
- 等等
看来我有两个变量: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 的场景,我在数据库中丢失了几行。 数据库应该是这样的: