Podczas pracy z zakresami dat i godzin bardzo często używa się zakresu obejmującego na początku i wykluczającego na końcu. Na przykład:
(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
Wartość mieści się w zakresie, gdy jest mniejsza lub równa początku i większa niż koniec (ale nie równa). W powyższym przykładzie 02:00
należy do drugiego zakresu, a nie do pierwszego. Innymi słowy:
Start <= value < End
Lub równoważnie,
Start <= value AND End > value
W matematyce przy użyciu notacji interwałowej , jest to tzw. interwał półotwarty.
[Start, End)
To zawsze lepsze podejście niż pomysł użycia wartości takiej jak 01:59:59
. Zastanów się, czy mam odjąć End - Start
aby uzyskać czas trwania. Spodziewałbym się, że odpowiedź będzie trwać godzinę, a nie 59 minut i 59 sekund.
Większość przykładów używa terminów Start/End
, ale czasami zobaczysz Start/End
lub Start/Stop
. Osobiście uważam, że najlepszym zestawem terminów do użycia, gdy masz zakres inkluzywny/wyłączny, jest Start/Until
. Ma tę dodatkową zaletę, że oba terminy mają 5 znaków, są ustawione alfabetycznie i wyraźnie wskazują, że data zakończenia jest wyłączna.
Ponadto, gdy mówisz o różnych wydarzeniach, powinieneś zapisywać swoje czasy jako UTC, aby uniknąć zamieszania wokół stref czasowych. Jest to ważne nawet w przypadku aplikacji lokalnych, ponieważ wiele stref czasowych przechodzi przez zmiany czasu letniego. Nie chcesz, aby wartości rejestrowane w bazie danych były niejednoznaczne. W MySQL możesz użyć TIMESTAMP
typ danych, aby upewnić się, że wartości są przechowywane jako UTC, lub możesz użyć DATETIME
typ danych, jeśli masz pewność, że pracujesz z wartościami UTC w kodzie aplikacji.