Re Domanda n. 1 :chiuso-aperto è il modo standard per gestire gli intervalli di date, con 20-25 anni di storia nella letteratura accademica. Vedi pp. 24-25 di Dati bitemporali di Tom Johnston e anche Sviluppo di applicazioni di database orientate al tempo in SQL di Richard Snodgrass.
Ma penso che uno dei motivi sia che gli intervalli consecutivi non si sovrappongono. Se a
è [May2016, Jun2016)
e b
è [Jun2016, Jul2016)
, non condividono giorni. Quindi "si agganciano insieme" e non devi preoccuparti dei casi limite in cui si toccano.
Nota che uno svantaggio (forse) di closed-open è che non puoi specificare un intervallo vuoto. [May2016, May2016)
è semplicemente un'autocontraddizione, mentre [May2016, May2016]
è un istante.
Ri Domanda n. 2 :Anche in questo caso avrebbe potuto essere diverso, ma mi vengono in mente diversi vantaggi nel rendere upper([May2016, Jun2016))
ritorno Jun2016
:
- Restituisce la stessa cosa indipendentemente dalla risoluzione dell'intervallo.
- È più simile al significato matematico di un endpoint aperto, dove è l'unico possibile risposta.
- Restituisce ciò che corrisponde all'"etichetta", quindi probabilmente è meno sorprendente.
- Ti permette di vedere facilmente se due intervalli "si incontrano":
upper(a) = lower(b)
.
Inoltre, tieni presente che in Postgres tutti i tipi di dati relativi al tempo sono discreti. C'era un'opzione per compilare Postgres con timestamp basati su float, ma è obsoleta e non l'ho mai incontrata.