ReВъпрос №1 :затворено-отворено е стандартният начин за обработка на периоди от време, с 20-25 години история в академичната литература. Вижте стр. 24-25 от Битемпорални данни от Том Джонстън, както и Разработване на ориентирани към времето приложения за бази данни в SQL от Ричард Снодграс.
Но мисля, че една от причините е, че последователните диапазони нямат припокриване. Ако a
е [May2016, Jun2016)
и b
е [Jun2016, Jul2016)
, те не споделят дни. Така че те „щракват заедно“ и не е нужно да се притеснявате за крайните кутии, където се допират.
Имайте предвид, че един недостатък (може би) на затворено-отворено е, че не можете да посочите празен диапазон. [May2016, May2016)
е просто противоречие само по себе си, докато [May2016, May2016]
е миг.
Re Въпрос #2 :Отново можеше да е различно, но се сещам за няколко предимства от правенето на upper([May2016, Jun2016))
върне Jun2016
:
- Връща едно и също нещо независимо от разделителната способност на диапазона.
- Това е по-скоро като математическото значение на отворена крайна точка, където е единственото възможен отговор.
- Връща това, което съответства на „етикета“, така че вероятно е по-малко изненадващо.
- Позволява ви лесно да видите дали два диапазона се „срещат“:
upper(a) = lower(b)
.
Също така имайте предвид, че в Postgres всички типовете данни, свързани с времето, са дискретни. Имаше опция за компилиране на Postgres с времеви отпечатъци, базирани на float, но тя е остаряла и никога не съм я срещал.