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.