sql >> Databasteknik >  >> RDS >> PostgreSQL

Varför returnerar postgres övre intervall för ett dateräng en exklusiv gräns?

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.




  1. SQL Server Transactional Replikering Interns

  2. Oracle - dynamiskt kolumnnamn i select-satsen

  3. Vissa NÅGON Aggregerade transformationer är trasiga

  4. Behöver hjälp med att lagra värde från tre kolumner