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

Perché la funzione di intervallo superiore di Postgres per un intervallo di date restituisce un limite esclusivo?

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.