sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvorfor returnerer postgres' øvre områdefunktion for en daterange en eksklusiv grænse?

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.




  1. Oprettelse af en valgmenu i PHP med standard valgt fra MySQL db

  2. Top 30 SQL Query-interviewspørgsmål, du skal praktisere i 2022

  3. Opdaterer post UDEN at opdatere tidsstempel

  4. Hvordan finder man databasenavnet på \data\base postgres-mapper?