sql >> Base de Datos >  >> RDS >> Mysql

Diseño de eventos de fecha y hora que no se superponen

Es muy común cuando se trabaja con rangos de fecha y hora que se utiliza un rango que es inclusivo al principio y exclusivo al final. Por ejemplo:

(using ISO8601 formatting)

Start                  End
2013-04-29T01:00:00Z - 2013-04-29T02:00:00Z
2013-04-29T02:00:00Z - 2013-04-29T03:00:00Z

Un valor está dentro del rango cuando es menor o igual que el inicio y mayor que (pero no igual) el final. En el ejemplo anterior, 02:00 pertenece al segundo rango, no al primero. En otras palabras:

Start <= value < End 

O de manera equivalente,

Start <= value  AND  End > value

En Matemáticas, usando Notación de intervalo , esto se conoce como intervalo "medio abierto".

[Start, End)

Este es siempre un mejor enfoque que la idea de usar un valor como 01:59:59 . Considere si tuviera que restar End - Start para obtener una duración. Espero que la respuesta sea una hora, no 59 minutos y 59 segundos.

La mayoría de los ejemplos usan los términos Start/End , pero a veces verás Begin/End o Start/Stop . Personalmente, creo que el mejor conjunto de términos para usar cuando tiene un rango inclusivo/exclusivo es Start/Until . Tiene la ventaja adicional de que ambos términos tienen 5 caracteres, se alinean alfabéticamente y transmiten explícitamente que la fecha de finalización es exclusiva.

Además, cuando habla de eventos distintos, debe registrar sus horas como UTC para evitar confusiones en torno a las zonas horarias. Esto es incluso importante para las aplicaciones locales, ya que muchas zonas horarias pasan por transiciones de ahorro de luz diurna. No desea que los valores que registre en la base de datos sean ambiguos. En MySQL, puede usar el TIMESTAMP tipo de datos para asegurarse de que los valores se almacenen como UTC, o puede usar el DATETIME tipo de datos si puede estar seguro de que está trabajando con valores UTC en el código de su aplicación.