Mysql
 sql >> Database >  >> RDS >> Mysql

Progettazione di eventi data-ora non sovrapposti

Quando si lavora con intervalli di data e ora è molto comune utilizzare un intervallo inclusivo all'inizio ed esclusivo alla fine. Ad esempio:

(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 valore è compreso nell'intervallo quando è minore o uguale all'inizio e maggiore (ma non uguale) alla fine. Nell'esempio sopra, 02:00 appartiene alla seconda fascia, non alla prima. In altre parole:

Start <= value < End 

O in modo equivalente,

Start <= value  AND  End > value

In matematica, utilizzando Notazione intervallo , questo è noto come intervallo "semiaperto".

[Start, End)

Questo è sempre un approccio migliore rispetto all'idea di utilizzare un valore come 01:59:59 . Considera se dovessi sottrarre End - Start per ottenere una durata. Mi aspetto che la risposta sia un'ora, non 59 minuti e 59 secondi.

La maggior parte degli esempi utilizza i termini Start/End , ma a volte vedrai Start/End o Start/Stop . Personalmente, penso che il miglior set di termini da utilizzare quando si dispone di un intervallo inclusivo/esclusivo sia Start/Until . Ha l'ulteriore vantaggio di avere entrambi i termini di 5 caratteri, allineati in ordine alfabetico e di indicare esplicitamente che la data di fine è esclusiva.

Inoltre, quando parli di eventi distinti, dovresti registrare i tuoi orari come UTC per evitare confusione sui fusi orari. Questo è importante anche per le applicazioni locali, poiché molti fusi orari passano attraverso le transizioni all'ora legale. Non vuoi che i valori registrati nel database siano ambigui. In MySQL, puoi usare il TIMESTAMP tipo di dati per assicurarti che i valori siano archiviati come UTC oppure puoi utilizzare il DATETIME tipo di dati se puoi essere sicuro di lavorare con valori UTC nel codice dell'applicazione.