SCD日期对的最佳实践(结束/打开时间戳)

时间:2013-11-15 16:35:09

标签: sql etl temporal scd bi-temporal

实现时间日期时间对时,这是更好的方法吗?

方法1

_RK   FROM_DTTM              TO_DTTM 
1     01-JAN-2012 00:00:00   31-DEC-2012 23:59:59 ------------> Old record closed out 
1     01-JAN-2013 00:00:00   31-DEC-4949 23:59:59 ------------> New active record

与过滤子句一起使用如下:

 where FROM_DTTM <= &FILTER_DATE <= TO_DTTM

方法2

_RK   FROM_DTTM              TO_DTTM 
1     01-JAN-2012 00:00:00   01-JAN-2013 00:00:00 ------------> Old record closed out 
1     01-JAN-2013 00:00:00   31-DEC-4949 23:59:59 ------------> New active record

与过滤子句一起使用如下:

 where FROM_DTTM <= &FILTER_DATE < TO_DTTM

考虑:

方法1与BETWEEN子句语法(包含范围)兼容。出于这个原因,我认为这是最好的方法 - 而且这是我的关注 - 在结束时间戳和开放时间戳之间总会存在差距!例如,以下内容(从业务角度来看)不会返回任何内容:

 where FROM_DTTM <= '31-DEC-2012 23:59:59.1'dt <= TO_DTTM

不同的数据库在这里具有不同的精度水平。我想必须有标准(在过滤时总是舍入到最接近的秒),但只是想知道是否有任何其他理由支持方法1(例如提议的双时间'AS OF'语法兼容性)?或者确实,方法2是否(以及为什么)更为可取。

1 个答案:

答案 0 :(得分:2)

对于continua(例如日期时间或数值测量),我几乎总是推荐半开区间法(方法2)。正如您所说,方法1往往会产生间隙,或者您需要知道计算终点的精确精度。计算方法2中的终点往往更简单。

就我而言,能够使用BETWEEN的“好处”是一个非常小的,与能够快速确保查询的正确性相比。

对于非连续数据(没有时间的日期,或离散的数字),我可能会恢复使用闭区间。