Dette kan afhænge af en række faktorer - operativsystemets regionale indstillinger, den aktuelle brugers sprog og datoformatindstillinger. Som standard bruger Windows amerikansk engelsk
, og brugerens indstillinger er US English
og MDY
.
Men her er nogle eksempler for at vise, hvordan dette kan ændre sig.
Brugeren bruger BRITISH sprogindstillinger:
-- virker:INDSTILL SPROG BRITISH;SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');-- fails:SELECT CONVERT(DATETIME, '04/13/2012');GO
(Fejl)
Brugeren bruger Français:
-- virker:INDSTILL SPROG FRANSK;VÆLG KONVERTER(DATETIME, '30-04-2012 19:01:45');-- fails:SELECT CONVERT(DATETIME, '04/13/2012');GO
(Fejl)
Brugeren bruger igen Français:
INDSTIL SPROG FRANSK;-- mislykkes (beviser, at ÅÅÅÅ-MM-DD, i modsætning til hvad mange tror, ikke altid er sikkert):SELECT CONVERT(DATETIME, '2012-04-30');GO
(Fejl)
Brugeren bruger DMY i stedet for MDY:
SET LANGUAGE ENGLISH;SET DATEFORMAT DMY;-- works:SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');-- fails:SELECT CONVERT(DATETIME, '04-30 -2012');GO
(Fejl)
Dit bedste bud er altid at bruge ISO-standard, ikke-regionale, sikre, utvetydige datoformater. De to jeg typisk anbefaler er:
ÅÅÅÅMMDD - kun for dato.ÅÅÅÅ-MM-DDTHH:MM:SS[.mmm] - for dato + tid, og ja, at T er vigtigt.
Ingen af disse fejler:
INDSTIL DATOFORMAT MDY;INDSTIL SPROG ENGELSK;VÆLG KONVERT(DATETIME, '20120430');SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');SET LANGUAGE FRENCH;SELECT CONVERT(DATETIME, '2012-04-30T19:01:45'); , '20120430');VÆLG KONVERTER(DATETIME, '2012-04-30T19:01:45');SET LANGUAGE BRITISH;SELECT CONVERT(DATETIME, '20120430');SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');SET DATEFORMAT DMY;SELECT CONVERT(DATETIME, '20120430');SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
Derfor anbefaler jeg kraftigt, at i stedet for at lade brugere skrive i fritekstdatoformater (eller at du selv bruger upålidelige formater), kontrollerer du dine inputstrenge og sørg for, at de overholder et af disse sikre formater. Så er det lige meget, hvilke indstillinger brugeren har, eller hvad de underliggende regionale indstillinger er, dine datoer vil altid blive fortolket som de datoer, de var beregnet til at være. Hvis du i øjeblikket lader brugere indtaste datoer i et tekstfelt på en formular, skal du stoppe med at gøre det og implementere en kalenderkontrol eller i det mindste en plukliste, så du i sidste ende kan styre det strengformat, der sendes tilbage til SQL Server.
For lidt baggrund kan du læse Tibor Karaszis "Den ultimative guide til datetime" datatyper" og mit indlæg "Dårlig Vaner at sparke :Forkert behandling af dato-/intervalforespørgsler."