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.