Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://vo.astronet.ru/wiki/historical_dates
Дата изменения: Unknown Дата индексирования: Sat Apr 9 22:55:54 2016 Кодировка: UTF-8 Поисковые слова: m 15 |
Основная задача - это реализация типа данных для работы (хранение и поиск) с историческими датами, учитывающий практически все возможные случаи их неопределенности.
Исторические даты отличаются неопределенностью - далеко не всегда известно не только точное время того или иного события, но и день, месяц, год. Порой они также задаются неравенствами вида ‘до такого-то момента’. В целом, можно выделить четыре основных случая такой неопределенности:
Тип данных реализован посредством композитного типа из двух timestamp-ов. Это дает как готовые парсеры и принтеры в широком диапазоне форматов, так и возможность реализовать все четыре класса интервалов, описанных выше - ‘+/-infinity’ является полноправным timestamp’ом, для которого действуют обычные правила их сравнения.
Пока реализован некоторый усеченный вариант интервальной логики Аллена. Таблица отношений такая
| A- < B- | B- < A- < B+ | A- > B+ --------------+---------+--------------+--------- A+ < B- | A < B | --- | --- --------------+---------+--------------+--------- B- < A+ < B+ | A <= B | A = B | | A && B | A && B | --- | | A <@ B | --------------+---------+--------------+--------- A+ > B+ | A = B | A >= B | A > B | A && B | A && B | | A @> B | |
Введены следующие операторы отношений:
hist=# select hdate('2003.05.01', '1 year'); hdate ----------------------------------------------- ("2003-05-01 00:00:00","2004-05-01 00:00:00") hist=# select hdate('yesterday', 'tomorrow'); hdate ----------------------------------------------- ("2011-04-12 00:00:00","2011-04-14 00:00:00") hist=# select hdate('yesterday', '-2 days'); hdate ----------------------------------------------- ("2011-04-10 00:00:00","2011-04-12 00:00:00") hist=# select hdate('1941'); hdate ----------------------------------------------- ("1941-01-01 00:00:00","1941-12-31 23:59:59") hist=# select hdate('1941.04'); hdate ----------------------------------------------- ("1941-04-01 00:00:00","1941-04-30 23:59:59") hist=# select hdate('1941-04-06'); hdate ----------------------------------------------- ("1941-04-06 00:00:00","1941-04-06 23:59:59") hist=# select hdate('2003.05.01', '1 year') < hdate('2005'); ?COLUMN? ---------- t hist=# select hdate('2003.05.01', '10 years') < hdate('2005'); ?COLUMN? ---------- f hist=# select hdate('2003.05.01', '10 year') <= hdate('2005.01.01', 'infinity'); ?COLUMN? ---------- t hist=# select hdate('today') = hdate('yesterday', 'tomorrow'); ?COLUMN? ---------- t