Re Otázka č. 1 :zavřeno-otevřeno je standardní způsob, jak zacházet s rozsahy dat, s 20-25letou historií v akademické literatuře. Viz str. 24–25 Bitemporálních dat od Toma Johnstona a také Vývoj časově orientovaných databázových aplikací v SQL od Richarda Snodgrasse.
Ale myslím, že jedním z důvodů je, že po sobě jdoucí rozsahy se nepřekrývají. Pokud a
je [May2016, Jun2016)
a b
je [Jun2016, Jul2016)
, nesdílejí žádné dny. Takže se „zaklapnou“ a nemusíte se starat o okrajová pouzdra, kde se dotýkají.
Všimněte si, že jednou nevýhodou (možná) uzavřeného-otevřeného je, že nemůžete zadat prázdný rozsah. [May2016, May2016)
je prostě seberozpor, zatímco [May2016, May2016]
je okamžik.
Re Otázka č. 2 :Opět to mohlo být jinak, ale napadá mě několik výhod vytvoření upper([May2016, Jun2016))
návrat Jun2016
:
- Vrátí to samé bez ohledu na rozlišení rozsahu.
- Je to spíše jako matematický význam otevřeného koncového bodu, kde je jediným možná odpověď.
- Vrátí to, co odpovídá „štítku“, takže je to pravděpodobně méně překvapivé.
- Umožňuje vám snadno zjistit, zda se dva rozsahy "setkají":
upper(a) = lower(b)
.
Všimněte si také, že v Postgres vše datové typy související s časem jsou diskrétní. Dříve existovala možnost kompilovat Postgres s časovými razítky založenými na float, ale je zastaralá a nikdy jsem se s ní nesetkal.