Till Fråga #1 :stängt-öppet är standardsättet att hantera datumintervall, med 20-25 års historia i den akademiska litteraturen. Se s. 24-25 i Bitemporal Data av Tom Johnston, och även Utveckla tidsorienterade databasapplikationer i SQL av Richard Snodgrass.
Men jag tror att en av anledningarna är att på varandra följande intervall inte har överlappning. Om a
är [May2016, Jun2016)
och b
är [Jun2016, Jul2016)
, de delar inte några dagar. Så de "snäpper ihop", och du behöver inte oroa dig för kantfodral där de rör vid.
Observera att en nackdel (kanske) med stängd-öppen är att du inte kan ange ett tomt intervall. [May2016, May2016)
är helt enkelt en självmotsägelse, medan [May2016, May2016]
är ett ögonblick.
Till Fråga #2 :Återigen kunde det ha varit annorlunda, men jag kan tänka mig flera fördelar med att göra upper([May2016, Jun2016))
returnera Jun2016
:
- Den returnerar samma sak oavsett intervallets upplösning.
- Det är mer som den matematiska betydelsen av en öppen slutpunkt, där den är den enda möjligt svar.
- Den returnerar det som matchar "etiketten", så det är utan tvekan mindre förvånande.
- Det låter dig enkelt se om två intervall "mötes":
upper(a) = lower(b)
.
Observera också att i Postgres all tidsrelaterade datatyper är diskreta. Det fanns tidigare ett alternativ att kompilera Postgres med flytbaserade tidsstämplar, men det är utfasat och jag har aldrig stött på det.