Лучшая практика для пар дат 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 (например, предлагаемая двухвременная совместимость синтаксиса 'OF OF')? Или действительно, предпочтителен ли (и почему) подход 2..
1 ответ
Для континуумов (таких как дата-время или числовые показатели) я почти всегда рекомендую подход с полуоткрытым интервалом (подход 2). Как вы говорите, подход 1 имеет тенденцию создавать пропуски, или вам нужно знать точную точность для вычисления конечной точки. Вычисление конечных точек в подходе 2 всегда бывает проще.
"Преимущество" возможности использовать BETWEEN
Насколько я понимаю, это очень незначительное по сравнению с возможностью быстро убедиться в правильности запроса.
Для не непрерывных данных (даты без времени или дискретные числа) я мог бы вернуться к использованию закрытого интервала.