PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Por que a função de intervalo superior do postgres para um intervalo de datas retorna um limite exclusivo?


Re Pergunta nº 1 :fechado-aberto é a maneira padrão de lidar com intervalos de datas, com 20 a 25 anos de história na literatura acadêmica. Consulte as páginas 24-25 de Dados Bitemporais por Tom Johnston, e também Desenvolvendo aplicativos de banco de dados orientados ao tempo em SQL por Richard Snodgrass.

Mas acho que uma das razões é que intervalos consecutivos não têm sobreposição. Se a é [May2016, Jun2016) e b é [Jun2016, Jul2016) , eles não compartilham nenhum dia. Assim, eles "se encaixam" e você não precisa se preocupar com casos extremos onde eles se tocam.

Observe que uma desvantagem (talvez) de fechado-aberto é que você não pode especificar um intervalo vazio. [May2016, May2016) é simplesmente uma autocontradição, enquanto [May2016, May2016] é um instante.

Re Pergunta nº 2 :Novamente, poderia ter sido diferente, mas posso pensar em várias vantagens de tornar upper([May2016, Jun2016)) return Jun2016 :
  • Ele retorna a mesma coisa, independentemente da resolução do intervalo.
  • É mais parecido com o significado matemático de um endpoint aberto, onde é o único resposta possível.
  • Ele retorna o que corresponde ao "rótulo", então, sem dúvida, é menos surpreendente.
  • Permite que você veja facilmente se dois intervalos "se encontram":upper(a) = lower(b) .

Além disso, observe que no Postgres todos tipos de dados relacionados ao tempo são discretos. Costumava haver uma opção para compilar Postgres com timestamps baseados em float, mas está obsoleta e nunca a encontrei.