A literális dátumláncok DATE értékekre történő nondeterminisztikus átalakítása

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Légy óvatos, amikor engedélyezed a CHARACTER stringek DATE adattípusokká történő átalakítását. Ennek oka, hogy az ilyen átváltások gyakran nem determinitisztikák.

Ezeket a nemdeterminisztikus átalakításokat úgy szabályozod, hogy figyelembe veszed a SET LANGUAGE és SET DATEFORMATbeállításait.

SET LANGUAGE példa: Hónap neve lengyel nyelven

  • SET LANGUAGE Polish;

Egy karakterlánc lehet egy hónap neve. De a név angolul, lengyelül, horvátul vagy más nyelven van? És a felhasználó ülése a megfelelő megfelelő LANGUAGEidőpontra lesz beállítva?

Például vegyük a listopád szót, ami egy hónap neve. De melyik hónapban van ez, attól függ, hogy az SQL rendszer szerint melyik nyelvet használja:

  • Ha lengyel, akkor a listopad a 11. hónapot jelenti (angolul november ).
  • Ha horvát nyelvű, akkor a listopad a 10. hónapot jelenti (angolul október ).

Kód példa SET LANGUAGE

--SELECT alias FROM sys.syslanguages ORDER BY alias;

DECLARE @yourInputDate  NVARCHAR(32) = '28 listopad 2018';

SET LANGUAGE Polish;
SELECT CONVERT(DATE, @yourInputDate) AS [SL_Polish];

SET LANGUAGE Croatian;
SELECT CONVERT(DATE, @yourInputDate) AS [SL_Croatian];

SET LANGUAGE English;


/***  Actual output:  For the two months, note the 11 versus the 10.
SL_Polish
2018-11-28

SL_Croatian
2018-10-28
***/

SET DATEFORMAT példa

  • SET DATEFORMAT dmy;

Az előző dmy formátum szerint egy példa '01-03-2018' időpontsort 2018 márciusának első napját értené.

Ha helyette mdy lenne megadva, akkor ugyanaz a '01-03-2018' sorozat 2018 januárjának harmadik napját jelentené.

És ha az ymd lenne megadva, nincs garancia arra, hogy milyen kimenet lenne. A '2018' számértéke túl nagy ahhoz, hogy egy nap legyen.

Konkrét országok/régiók

Japánban és Kínában az DATEFORMATymd kifejezést használják. A formátum részei egy értelmes sorrendben vannak a legnagyobb egységtől a legkisebbig. Szóval ez a formátum jól működik. Ezt a formátumot tekintik nemzetközi formátumnak. Ez nemzetközi, mert az év négy számjegye egyértelmű, és egyetlen ország vagy régió sem használja a Földön az ekaikus YDM formátumot.

Más országokban/régiókban, például Németországban és Franciaországban a DATEFORMATdmy, ami azt jelenti: 'dd-mm-yyyy'. A dmy formátum nem rendezi jól, de ez egy ésszerű sorozat a legkisebb egységből a legnagyobbig.

Az Egyesült Államok és a Mikronézia Federated States az egyetlen országok/régiók, amelyek használják az MDY-t, ami nem válogat. A formátum vegyes szekvenciája megfelel a beszélt randikon használt verbális beszédmintának.

Kód példa: SET DATEFORMATmdy kontra dmy

A következő Transact-SQL kód példa ugyanazt a dátumú karakterláncot használja három különböző DATEFORMAT beállítással. A kód futtatása a kommentben látható kimenetet eredményezi:

DECLARE @yourDateString NVARCHAR(10) = '12-09-2018';
PRINT @yourDateString + '  = the input.';

SET DATEFORMAT dmy;
SELECT CONVERT(DATE, @yourDateString) AS [DMY-Interpretation-of-input-format];

SET DATEFORMAT mdy;
SELECT CONVERT(DATE, @yourDateString) AS [MDY-Interpretation-of-input-format];

SET DATEFORMAT ymd;
SELECT CONVERT(DATE, @yourDateString) AS [YMD-Interpretation--?--NotGuaranteed];


/***  Actual output:
12-09-2018  = the input.

DMY-Interpretation-of-input-format
2018-09-12

MDY-Interpretation-of-input-format
2018-12-09

YMD-Interpretation--?--NotGuaranteed
2018-12-09
***/

Az előző kód példában az utolsó példában eltér az ymd formátum és a bemeneti string között. A bemeneti lánc harmadik csomópontja egy olyan numerikus értéket képvisel, amely túl nagy ahhoz, hogy egy napnak számítson. A Microsoft nem garantálja az ilyen eltérések kimeneti értékét.

A CONVERT explicit kódokat kínál a dátumformátumok determinisztikus szabályozásához

A CAST és CONVERT dokumentációs cikkünk kifejezetten olyan kódokat sorol, amelyeket a CONVERT funkcióval determinisztikusan szabályozhatsz a dátumváltásokat. Minden hónapban a cikk az egyik legmagasabb oldalmegtekintési számunk van.

Kompatibilitási szint 90 vagy annál magasabb

Az SQL Server 2000-ben a kompatibilitási szint 80 volt. 80 vagy annál alacsonyabb szintbeállításoknál az implicit dátumváltások determinisztikus voltak.

Az SQL Server 2005-től kezdve és annak 90-es kompatibilitási szintjétől az implicit dátumváltások nem determinisztikussá váltak. A dátumváltások a SETSET LANGUAGESETSET DATEFORMAT 90-es szinttől kezdve függővé váltak.

Unicode

A nem Unicode karakteradatok átalakítása a kollációk között szintén nondeterminisztikusnak számít.

Lásd még