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.