Dato og tid i SQL Server

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.
SQL Server kan ikke oversætte dato eller klokkeslæt til en gyldig værdi

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'
Ordrer på en bestemt dato

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'
Ordrer på alle andre datoer

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'
Datoer senere end findes med “større end”

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'
Datoer tidligere end findes med “mindre end”

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-%'
LIKE sammen med datoer dur ikke, resultatet er tomt – bemærk, at det ikke er en fejl!

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'
BETWEEN giver alle datoer i perioden, inklusive start- og slutdato

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.