Mysql
 sql >> Base de données >  >> RDS >> Mysql

Conception d'événements date-heure sans chevauchement

Il est très courant, lorsque vous travaillez avec des plages de dates et d'heures, d'utiliser une plage inclusive au début et exclusive à la fin. Par exemple :

(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

Une valeur est dans la plage lorsqu'elle est inférieure ou égale au début et supérieure (mais non égale) à la fin. Dans l'exemple ci-dessus, 02:00 appartient à la deuxième gamme, pas à la première. En d'autres termes :

Start <= value < End 

Ou de façon équivalente,

Start <= value  AND  End > value

En mathématiques, en utilisant notation d'intervalle , c'est ce qu'on appelle un intervalle "semi-ouvert".

[Start, End)

C'est toujours une meilleure approche que l'idée d'utiliser une valeur comme 01:59:59 . Considérez si je devais soustraire End - Start pour obtenir une durée. Je m'attendrais à ce que la réponse soit une heure, pas 59 minutes et 59 secondes.

La plupart des exemples utilisent les termes Start/End , mais parfois vous verrez Begin/End ou Start/Stop . Personnellement, je pense que le meilleur ensemble de termes à utiliser lorsque vous avez une plage inclusive/exclusive est Start/Until . Il présente l'avantage supplémentaire que les deux termes comportent 5 caractères, s'alignent par ordre alphabétique et indiquent explicitement que la date de fin est exclusive.

De plus, lorsque vous parlez d'événements distincts, vous devez enregistrer vos heures au format UTC pour éviter toute confusion autour des fuseaux horaires. Ceci est même important pour les applications locales, car de nombreux fuseaux horaires passent par des transitions d'heure d'été. Vous ne voulez pas que les valeurs que vous enregistrez dans la base de données soient ambiguës. Dans MySQL, vous pouvez utiliser le TIMESTAMP type de données pour vous assurer que les valeurs sont stockées au format UTC, ou vous pouvez utiliser le DATETIME type de données si vous pouvez être sûr que vous travaillez avec des valeurs UTC dans votre code d'application.