Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Projetando eventos de data e hora não sobrepostos


É muito comum ao trabalhar com intervalos de data e hora que você use um intervalo que seja inclusivo no início e exclusivo no final. Por exemplo:
(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

Um valor está no intervalo quando é menor ou igual ao início e maior que (mas não igual) ao final. No exemplo acima, 02:00 pertence ao segundo intervalo, não ao primeiro. Em outras palavras:
Start <= value < End 

Ou equivalente,
Start <= value  AND  End > value

Em matemática, usando Notação de intervalo , isso é conhecido como intervalo "semi-aberto".
[Start, End)

Essa é sempre uma abordagem melhor do que a ideia de usar um valor como 01:59:59 . Considere se eu fosse subtrair End - Start para obter uma duração. Eu esperaria que a resposta fosse uma hora, não 59 minutos e 59 segundos.

A maioria dos exemplos usa os termos Start/End , mas às vezes você verá Begin/End ou Start/Stop . Pessoalmente, acho que o melhor conjunto de termos para usar quando você tem um intervalo inclusivo/exclusivo é Start/Until . Ele tem a vantagem adicional de ambos os termos serem de 5 caracteres, alinhados em ordem alfabética e transmitindo explicitamente que a data de término é exclusiva.

Além disso, quando você estiver falando sobre eventos distintos, você deve registrar seus horários como UTC para evitar confusão em torno dos fusos horários. Isso é ainda importante para aplicativos locais, pois muitos fusos horários passam por transições de horário de verão. Você não quer que os valores registrados no banco de dados sejam ambíguos. No MySQL, você pode usar o TIMESTAMP tipo de dados para garantir que os valores sejam armazenados como UTC, ou você pode usar o DATETIME tipo de dados se tiver certeza de que está trabalhando com valores UTC no código do aplicativo.