Re Pregunta #1 :cerrado-abierto es la forma estándar de manejar rangos de fechas, con 20-25 años de historia en la literatura académica. Ver págs. 24-25 de Datos Bitemporales por Tom Johnston, y también Desarrollo de aplicaciones de bases de datos orientadas al tiempo en SQL por Richard Snodgrass.
Pero creo que una de las razones es que los rangos consecutivos no se superponen. Si a
es [May2016, Jun2016)
y b
es [Jun2016, Jul2016)
, no comparten ningún día. Por lo tanto, se "encajan" y no tiene que preocuparse por los casos extremos donde se tocan.
Tenga en cuenta que un inconveniente (tal vez) de cerrado-abierto es que no puede especificar un rango vacío. [May2016, May2016)
es simplemente una autocontradicción, mientras que [May2016, May2016]
es un instante.
Re Pregunta n.º 2 :Nuevamente, podría haber sido diferente, pero puedo pensar en varias ventajas de hacer upper([May2016, Jun2016))
volver Jun2016
:
- Devuelve lo mismo independientemente de la resolución del rango.
- Es más como el significado matemático de un punto final abierto, donde es el único posible respuesta.
- Devuelve lo que coincide con la "etiqueta", por lo que podría decirse que es menos sorprendente.
- Te permite ver fácilmente si dos rangos "se encuentran":
upper(a) = lower(b)
.
Además, tenga en cuenta que en Postgres todas los tipos de datos relacionados con el tiempo son discretos. Solía haber una opción para compilar Postgres con marcas de tiempo basadas en flotadores, pero está obsoleta y nunca la he encontrado.