É 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.