我正在尝试查看是否可以有效地选择给定日期所属的时期。
假设我有一张桌子
id<long>|period_start<date>|period_end<date>|period_number<int>
假设我希望每个 id 都有“2013-11-20”所属的时期。
即天真
select id, period_number
from period_table
where '2013-11-20' >= period_start and '2013-11-20' < period_end
但是,如果我的日期超出任何 period_end 或任何 period_start 之前,它将找不到此 ID。在这些情况下,我想要最小值(如果在第一个之前period_start
)或最大值(如果在最后一个之后period_end
)。
如果这可以有效地完成,有什么想法吗?我显然可以做多个查询(即选择到上面的表中,然后做另一个查询来确定最小和最大周期)。
所以例如
+--+------------+----------+-------------+
|id|period_start|period_end|period_number|
+--+------------+----------+-------------+
|1 |2011-01-01 |2011-12-31|1 |
|1 |2012-01-01 |2012-12-31|2 |
|1 |2013-01-01 |2013-12-31|3 |
+--+------------+----------+-------------+
如果我想要 2012-05-03 属于哪个时期,我的天真 sql 可以工作并返回时期 #2(1|2 作为行,id,period_number)。但是,如果我想要什么时期 2014-01-14(或 2010-01-14)它不能把它放在桌子外面。
因此,由于“2014-01-14”> 2013-12-31,如果我选择 2010-01-14,我希望它返回行“1|3”,我希望它返回 1|1,如2010 年 1 月 14 日 < 2011 年 1 月 1 日。
关键是我们有一个索引表,可以跟踪不同类型的时期以及它们对许多不同事物的相对价值(想想季度、半年、年),而且它们都与正常年份不一致。有时我们想说我们想要相对于日期 Y 的周期 X(某个整数)。如果我们可以将 Y 放在表中并计算出 Y 的period_number
值,我们就可以轻松地进行数学计算来确定要添加/减去该值的内容。如果 Y 在表格的边界之外,我们将 Y 分别定义为表格的最大值/最小值。