Ad Spørgsmål #1 :lukket-åben er standardmetoden til at håndtere datointervaller, med 20-25 års historie i den akademiske litteratur. Se side 24-25 i Bitemporal Data af Tom Johnston, og også Udvikling af tidsorienterede databaseapplikationer i SQL af Richard Snodgrass.
Men jeg tror, at en af grundene er, at fortløbende intervaller ikke har overlap. Hvis a
er [May2016, Jun2016)
og b
er [Jun2016, Jul2016)
, de deler ingen dage. Så de "klikker sammen", og du behøver ikke bekymre dig om kantsager, hvor de rører ved.
Bemærk, at en ulempe (måske) ved lukket-åben er, at du ikke kan angive et tomt område. [May2016, May2016)
er simpelthen en selvmodsigelse, hvorimod [May2016, May2016]
er et øjeblik.
Ad Spørgsmål #2 :Igen kunne det have været anderledes, men jeg kan komme i tanke om flere fordele ved at lave upper([May2016, Jun2016))
returner Jun2016
:
- Det returnerer det samme uanset opløsningen af området.
- Det er mere som den matematiske betydning af et åbent endepunkt, hvor det er det eneste muligt svar.
- Det returnerer det, der matcher "etiketten", så det er uden tvivl mindre overraskende.
- Det lader dig nemt se, om to områder "mødes":
upper(a) = lower(b)
.
Bemærk også, at i Postgres all tidsrelaterede datatyper er diskrete. Der plejede at være en mulighed for at kompilere Postgres med float-baserede tidsstempler, men det er forældet, og jeg har aldrig stødt på det.