I SQL Server skriver vi dato og klokkeslæt som tekst i et fastlagt format. Men dato og klokkeslæt opfører sig ikke altid som andre tekstfelter. I denne lektion lærer du at bruge dato og klokkeslæt i en WHERE-sætning og samtidig får du kortvarigt snuset til den logiske AND-operator, da den er en del af BETWEEN-operatoren.
Eksempler på datoer:
- 22. april 2020: ‘2020-04-22’
- 1. februar 1946: ‘1946-02-01’
- 29. februar 2020: ‘2020-02-29’
Ovenstående datoer alle er gyldige, men hvis du taster en ugyldig dato, som f.eks. 29. februar i 2019 (som ikke er et skudår), får du en fejl fra SQL Server:
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
Eksempler på klokkeslæt:
- Timer, minutter ’11:05′
- og sekunder ’11:05:25′
- og millisekunder ’11:05:25.934′
Vi bruger 24-timers-ur:
- Timer, minutter, sekunder ’21:14:58′
Dato og klokkeslæt på én gang adskilles af et mellemrum, 20. april 2020 kvart over syv om aftenen og nogle sekunder: ‘2020-04-20 19:15:25’ mere præcist med 354 millisekunder: ‘2020-04-20 19:15:25.354’.
Ugyldige klokkeslæt giver også samme fejl som ovenfor.
Find ordrer fra en bestemt dato
Et hurtigt kig i Ordre-tabellen giver os en kolonne med navnet Dato, som vi kan bruge til at finde rækker ud fra en bestemt dato. Find rækker, hvor ordredato er 20. april 2020.
SELECT * FROM Ordre
WHERE Dato = '2020-04-20'
Hvis du gerne vil se rækkerne oprettet alle andre datoer end 20. april 2020, har du sikkert gættet, at du kan anvende <> (ikke lig med):
SELECT * FROM Ordre
WHERE Dato <> '2020-04-20'
Sådan finder du rækker før og efter en dato
Når du fremover skal arbejde med datoer og klokkeslæt, er det ofte ud fra at ønske om at se rækker, som er oprettet før eller efter en bestemt dato. I den sammenhæng bruger du > og < til at afgøre dette.
Større end betyder, at datoen ligger efter. Læs denne sætning som: Dato er større end (altså senere end, længere ude i fremtiden end) 20. april 2020:
SELECT * FROM Ordre
WHERE Dato > '2020-04-20'
Helt som forventet bruger du mindre end, til at finde værdier i fortiden: Dato er mindre end (altså tidligere end, længere tilbage i fortiden end) 20. april 2020:
SELECT * FROM Ordre
WHERE Dato < '2020-04-20'
Brug ikke LIKE med dato og klokkeslæt
Det er fristende at opfatte datoer som ren tekst lagret i databasen. Men sådan er det ikke. Selv om du skriver dato og klokkeslæt i apostroffer, bliver værdien oversat og lagret som et felt af typen datetime i SQL Server.
LIKE-operatoren fungerer ikke som forventet med jokertegn på datoer.
Følgende kan altså ikke bruges til at finde Ordre oprettet i april 2020:
SELECT * FROM Ordre
WHERE Dato LIKE '2020-04-%'
Der er andre måder at løse denne problemstilling på med dato- og tid-funktionerne eller BETWEEN-operator, som du kan se herunder.
Perioder kan findes med BETWEEN
Det er ganske naturligt at have et ønske om at se rækker, som har en start- og slutdato i en given periode. BETWEEN-operatoren er god at kende, da det er nemt at forstå, når du læser SQL, at dato skal ligge mellem to angivne værdier. Alternativet til at bruge BETWEEN er at sammenligne med >= og <=. Bemærk, at BETWEEN inkluderer begge datoer i resultatet.
SELECT * FROM Ordre
WHERE Dato BETWEEN '2020-04-19' AND '2020-04-21'
Prøv selv
- Find ordrer oprettet før eller på 21. april 2020.
- Find ordrer oprettet efter 21. april 2020.
- Find ordrer oprettet før kl. 19 d. 21. april 2020.
- Find ordrer oprettet mellem 17. april og 19. april (begge inklusive)
- Find ordrer oprettet mellem 17. april og 20. april (begge eksklusive)
I videoen kan du se alternative løsninger til de to sidste opgaver.