Документ взят из кэша поисковой машины. Адрес оригинального документа : http://vo.astronet.ru/wiki/historical_dates
Дата изменения: Unknown
Дата индексирования: Sat Apr 9 22:55:54 2016
Кодировка: UTF-8

Поисковые слова: п п п п п п п п п п п п п
historical_dates [SAI Virtual Observatory - Wiki]

Работа с историческими датами в PostgreSQL

Основная задача - это реализация типа данных для работы (хранение и поиск) с историческими датами, учитывающий практически все возможные случаи их неопределенности.

Исторические даты отличаются неопределенностью - далеко не всегда известно не только точное время того или иного события, но и день, месяц, год. Порой они также задаются неравенствами вида ‘до такого-то момента’. В целом, можно выделить четыре основных случая такой неопределенности:

  • Точная историческая дата - имеет четко определенную дату и время.
  • Неточная дата - известен лишь некоторый интервал, ее содержащий. Вот возможные примеры:
    • 1912-02-05 - момент задан с точностью до суток
    • 315 BC - момент с точностью до года
    • XV век - момент с точностью до века
    • во время Реформации - с точностью до длительного интервала
  • Дата, заданная правым неравенством - событие, произошедшее до заданного момента, но когда именно - неизвестно
  • Дата, заданная левым неравенством - событие после заданного момента

Реализация

Тип данных реализован посредством композитного типа из двух 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  |              |

Введены следующие операторы отношений:

  • > и < - (after и before) строго больше или меньше, то есть и начало и конец первого события позже начала второго, или наоборот.
  • >= и - (подвиды overlaps) условно больше или меньше - то есть начало первого позже начала второго и его конец - тоже после конца второго, и наоборот (фактически асимметричные перекрытия).
  • = (during) равенство для случая, когда один из интервалов полностью лежит внутри другого (неважно, первый или второй) - то есть даты фактически совпадают в пределах неопределенности
  • @> - (during) интервал первой даты полностью покрывает интервал второй
  • <@ - (during) интервал первой даты полностью лежит внутри интервала второй
  • && - (overlaps) просто пересекающиеся интервалами даты (то есть в принципе могли быть одновременно, а могли - и нет).

Примеры использования

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

Файлы

historical_dates.txt · Last modified: 2011/04/28 02:23 by karpov
Back to top
SAI VO | Astronet | SAI MSU | Legal Information
RFBR