Det är mycket vanligt när man arbetar med datum- och tidsintervall att man använder ett intervall som är inklusive i början och exklusivt i slutet. Till exempel:
(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
Ett värde är inom intervallet när det är mindre än eller lika med början och större än (men inte lika med) slutet. I exemplet ovan, 02:00
tillhör det andra intervallet, inte det första. Med andra ord:
Start <= value < End
Eller motsvarande,
Start <= value AND End > value
I matematik använder du Intervallnotation , detta är känt som ett "halvöppet" intervall.
[Start, End)
Detta är alltid ett bättre tillvägagångssätt än idén att använda ett värde som 01:59:59
. Fundera på om jag skulle subtrahera End - Start
för att få en varaktighet. Jag förväntar mig att svaret är en timme, inte 59 minuter och 59 sekunder.
De flesta exempel använder termerna Start/End
, men ibland ser du Begin/End
eller Start/Stop
. Personligen tror jag att den bästa uppsättningen termer att använda när du har ett inkluderande/exklusivt intervall är Start/Until
. Det har den extra fördelen att båda termerna är 5 tecken, ordnade alfabetiskt och uttryckligen förmedlar att slutdatumet är exklusivt.
Dessutom, när du pratar om distinkta händelser, bör du registrera dina tider som UTC för att förhindra förvirring kring tidszoner. Detta är till och med viktigt för lokala applikationer, eftersom många tidszoner går igenom sommartidsövergångar. Du vill inte att värdena du registrerar i databasen ska vara tvetydiga. I MySQL kan du använda TIMESTAMP
datatyp för att säkerställa att värden lagras som UTC, eller så kan du använda DATETIME
datatyp om du kan vara säker på att du arbetar med UTC-värden i din applikationskod.