All*_*owe 5 sql etl temporal scd bi-temporal
在实现时间日期时间对时,哪种方法更好?
方法一
_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
Run Code Online (Sandbox Code Playgroud)
与过滤子句一起使用,如下所示:
where FROM_DTTM <= &FILTER_DATE <= TO_DTTM
Run Code Online (Sandbox Code Playgroud)
方法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
Run Code Online (Sandbox Code Playgroud)
与过滤子句一起使用,如下所示:
where FROM_DTTM <= &FILTER_DATE < TO_DTTM
Run Code Online (Sandbox Code Playgroud)
注意事项:
方法 1 与 BETWEEN 子句语法(包含范围)兼容。出于这个原因,我认为这是最好的方法,但是 - 这是我担心的 - 关闭和打开时间戳之间总是存在差距!例如,以下内容(从业务角度来看是错误的)不会返回任何内容:
where FROM_DTTM <= '31-DEC-2012 23:59:59.1'dt <= TO_DTTM
Run Code Online (Sandbox Code Playgroud)
不同的数据库在这里会有不同的精度级别。我想必须有一个标准(过滤时总是四舍五入到最接近的秒),但只是想知道是否还有其他原因支持方法 1(例如建议的双时态“AS OF”语法兼容性)?或者确实,方法 2 是否(以及为什么)更可取。
对于连续体(例如日期时间或数值度量),我几乎总是推荐半开区间方法(方法 2)。正如您所说,方法 1 往往会产生间隙,或者您需要知道计算终点的准确精度。计算方法 2 中的终点总是更简单。
BETWEEN
就我而言,与能够快速确保查询的正确性相比,能够使用的“好处”是非常小的。
对于非连续数据(没有时间的日期或离散数字),我可能会恢复使用闭区间。