sql >> Database >  >> RDS >> PostgreSQL

Waarom retourneert de bovenste bereikfunctie van postgres voor een datumbereik een exclusieve grens?

Over Vraag #1 :closed-open is de standaardmanier om met datumbereiken om te gaan, met 20-25 jaar geschiedenis in de academische literatuur. Zie pp. 24-25 van Bitemporele gegevens door Tom Johnston, en ook Tijdsgeoriënteerde database-applicaties ontwikkelen in SQL door Richard Snodgrass.

Maar ik denk dat een van de redenen is dat opeenvolgende bereiken geen overlap hebben. Als a is [May2016, Jun2016) en b is [Jun2016, Jul2016) , ze delen geen dagen. Ze klikken dus in elkaar en je hoeft je geen zorgen te maken over randgevallen waar ze elkaar raken.

Merk op dat een nadeel (misschien) van closed-open is dat je geen leeg bereik kunt specificeren. [May2016, May2016) is gewoon een tegenstrijdigheid met zichzelf, terwijl [May2016, May2016] is een moment.

Over Vraag #2 :Nogmaals, het had anders kunnen zijn, maar ik kan verschillende voordelen bedenken van het maken van upper([May2016, Jun2016)) retourneer Jun2016 :

  • Het geeft hetzelfde terug, ongeacht de resolutie van het bereik.
  • Het lijkt meer op de wiskundige betekenis van een open eindpunt, waar het de enige . is mogelijk antwoord.
  • Het geeft terug wat overeenkomt met het 'label', dus het is waarschijnlijk minder verrassend.
  • Hiermee kun je gemakkelijk zien of twee bereiken "voldoen":upper(a) = lower(b) .

Merk ook op dat in Postgres alle tijdgerelateerde datatypes zijn discreet. Er was een optie om Postgres te compileren met op float gebaseerde tijdstempels, maar deze is verouderd en ik ben hem nog nooit tegengekomen.




  1. Tekst zoeken in meerdere velden MySQL

  2. Hoe kan ik een kolom aan een werktabel toevoegen met behulp van een nieuwe opgeslagen procedure?

  3. Waarom treedt er een time-out op voor een query als deze binnen de time-outlimiet valt?

  4. Hoe de beginwaarde en automatische verhoging in MySQL in te stellen?