sql >> Databáze >  >> RDS >> Sqlserver

Jak SQL Server rozhodne o formátu pro implicitní převod data a času?

To může záviset na různých faktorech – místním nastavení operačního systému, aktuálním jazyce uživatele a nastavení formátu data. Ve výchozím nastavení Windows používá US English a uživatelská nastavení jsou US English a MDY .

Zde je ale několik příkladů, které ukazují, jak se to může změnit.

Uživatel používá nastavení jazyka BRITISH:

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

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

(Chyba)

Uživatel používá Français:

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

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

(Chyba)

Uživatel opět používá 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

(Chyba)

Uživatel používá DMY místo 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

(Chyba)

Nejlepším řešením je vždy používat standardní formáty ISO, neregionální, bezpečné a jednoznačné formáty data. Obvykle doporučuji tyto dva:

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

Žádný z těchto selže:

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');

Proto důrazně doporučuji, abyste místo toho, abyste uživatelům umožňovali zadávat volné formáty data (nebo abyste sami používali nespolehlivé formáty), kontrolovali své vstupní řetězce a ujistili se, že dodržují jeden z těchto bezpečných formátů. Pak nebude záležet na tom, jaká nastavení má uživatel nebo jaká jsou základní regionální nastavení, vaše data budou vždy interpretována jako data, pro která byla zamýšlena. Pokud aktuálně umožňujete uživatelům zadávat data do textového pole ve formuláři, přestaňte s tím a implementujte ovládací prvek kalendáře nebo alespoň výběrový seznam, abyste mohli nakonec ovládat formát řetězce, který je předán zpět na SQL Server.

Pro nějaké pozadí si prosím přečtěte od Tibora Karasziho „Ultimátní průvodce datem a časem datové typy" a můj příspěvek "Špatné Habits to Kick :Nesprávné zpracování dotazů na datum/rozsah."



  1. SQL Server pivot vs. vícenásobné spojení

  2. Používáte pojmenované instance? Otestujte připojení DAC!

  3. Neo4j - Výběr dat pomocí MATCH pomocí Cypher

  4. Co znamená <> v Oracle