sql >> Database >  >> RDS >> Sqlserver

Hoe bepaalt SQL Server het formaat voor impliciete datetime-conversie?

Dit kan van verschillende factoren afhangen:de landinstellingen van het besturingssysteem, de taal van de huidige gebruiker en de instellingen voor datumnotatie. Standaard gebruikt Windows US English , en de gebruikersinstellingen zijn US English en MDY .

Maar hier zijn enkele voorbeelden om te laten zien hoe dit kan veranderen.

Gebruiker gebruikt BRITSE taalinstellingen:

-- works:
SET LANGUAGE BRITISH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');

-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO

(Fout)

Gebruiker gebruikt Français:

-- works:
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');

-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO

(Fout)

Gebruiker gebruikt opnieuw Français:

SET LANGUAGE FRENCH;

-- fails (proving that, contrary to popular belief, YYYY-MM-DD is not always safe):
SELECT CONVERT(DATETIME, '2012-04-30');
GO

(Fout)

Gebruiker gebruikt DMY in plaats van 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

(Fout)

Uw beste gok is altijd om ISO-standaard, niet-regionale, veilige, ondubbelzinnige datumnotaties te gebruiken. De twee die ik meestal aanbeveel zijn:

YYYYMMDD                  - for date only.
YYYY-MM-DDTHH:MM:SS[.mmm] - for date + time, and yes that T is important.

Geen van deze faalt:

SET DATEFORMAT MDY;
SET LANGUAGE ENGLISH;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(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');

Daarom raad ik u ten zeerste aan om in plaats van gebruikers vrije-tekstdatumformaten te laten typen (of dat u zelf onbetrouwbare formaten gebruikt), uw invoerreeksen te controleren en ervoor te zorgen dat ze voldoen aan een van deze veilige formaten. Dan maakt het niet uit welke instellingen de gebruiker heeft of wat de onderliggende regionale instellingen zijn, uw datums zullen altijd worden geïnterpreteerd als de datums waarop ze bedoeld waren. Als u momenteel gebruikers datums laat invoeren in een tekstveld op een formulier, stop daarmee en implementeer een kalenderbesturingselement of op zijn minst een keuzelijst, zodat u uiteindelijk de tekenreeksindeling kunt bepalen die wordt teruggegeven aan SQL Server.

Lees voor wat achtergrondinformatie Tibor Karaszi's "The ultimate guide to the datetime datatypes" en mijn post "Slecht Gewoonten om te schoppen:verkeerde behandeling van vragen over datum/bereik."



  1. Zoek een waarde in de kolomwaarde die door komma's gescheiden waarden opslaat

  2. Hoe schrijf je een regex lookahead/lookbehind in mysql

  3. PHP:PDO Query retourneert geen resultaten, maar dezelfde query retourneert 4 resultaten in phpmyadmin?

  4. AVG ophalen waarbij nul- of nulwaarden worden genegeerd