PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Warum gibt die obere Bereichsfunktion von Postgres für einen Datumsbereich eine exklusive Grenze zurück?

Zu Frage Nr. 1 :Geschlossen-offen ist die Standardmethode, um mit Datumsbereichen umzugehen, mit einer Geschichte von 20-25 Jahren in der akademischen Literatur. Siehe Seiten 24-25 von Bitemporal Data von Tom Johnston und auch Developing Time-Oriented Database Applications in SQL von Richard Snodgrass.

Aber ich denke, einer der Gründe ist, dass sich aufeinanderfolgende Bereiche nicht überschneiden. Wenn a ist [May2016, Jun2016) und b ist [Jun2016, Jul2016) , sie teilen keine Tage. Sie "schnappen zusammen", und Sie müssen sich keine Gedanken über Grenzfälle machen, wo sie sich berühren.

Beachten Sie, dass ein Nachteil (möglicherweise) von geschlossen-offen darin besteht, dass Sie keinen leeren Bereich angeben können. [May2016, May2016) ist einfach ein Selbstwiderspruch, während [May2016, May2016] ist ein Augenblick.

Zu Frage #2 :Auch hier hätte es anders sein können, aber ich kann mir mehrere Vorteile vorstellen, wenn ich upper([May2016, Jun2016)) mache geben Sie Jun2016 zurück :

  • Es gibt dasselbe zurück, unabhängig von der Auflösung des Bereichs.
  • Es ist eher wie die mathematische Bedeutung eines offenen Endpunkts, wo es der einzige ist mögliche Antwort.
  • Es gibt das zurück, was mit dem "Label" übereinstimmt, also ist es wohl weniger überraschend.
  • Damit können Sie leicht erkennen, ob sich zwei Bereiche "treffen":upper(a) = lower(b) .

Beachten Sie auch, dass in Postgres alle zeitbezogene Datentypen sind diskret. Früher gab es eine Option, Postgres mit Float-basierten Zeitstempeln zu kompilieren, aber sie ist veraltet und mir ist sie nie begegnet.