2013-11-15 75 views
4

在實現時間日期時間對時,哪種方法更好?SCD日期對的最佳實踐(關閉/打開時間戳)

方法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更可取。

+0

那麼,我已經實現了SAS DDS,我仍然討厭時間有效性的數據時間值。現在,我只是存儲日期值。我懷疑你會跟蹤盤中的變化。 – vasja

+0

不知道我是否同意,但不過 - 應該使用哪種方法?我們有與日期值相同的困境! –

+1

對於'imprecise'或變量精度類型(基本上,除了整數計數以外的任何內容)的所有實例,請[閱讀此博客文章](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/9 what-do-between-and-the-devil-have-in-common.aspx)(它實際上是關於時間戳的,並且有些特定於SQL Server)。就我個人而言,我認爲應該從標準中刪除「BETWEEN」,特別是因爲您考慮列出的「但是」;它只是鼓勵人們錯誤地思考這樣的範圍...... –

回答

2

對於連續性(如datetime或數字度量),我幾乎總是推薦半開區間方法(方法2)。正如你所說,方法1傾向於產生差距,或者你需要知道確切的精度來計算終點。計算方法2中的終點總是趨於簡單。

就我而言,能夠使用BETWEEN的「好處」與能夠快速確保查詢的正確性相比是非常小的。

對於非連續數據(無日期的日期或離散數字),我可能會恢復爲使用閉區間。

+0

正確..數據/查詢的準確性比語法的簡便性更重要。謝謝! –

+1

在下面關於雙時間的文檔上進行了審查之後,方法2似乎與提出的「AS OF TIMESTAMP」語法兼容。所以更多的理由避免方法1 .. https://www.cs.arizona.edu/~rts/pubs/Teradatacasestudy.pdf –

+1

好的 - 我想我們有一個明確的答案! 「類型2維度記錄的最終生效日期時間必須完全等於該維度成員下一次更改的開始生效日期時間。」 (http://www.kimballgroup.com/2008/09/22/slowly-changing-dimensions-part-2/) –