Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics 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.
- CAST és CONVERT (Transact-SQL): Dátum és időpont stílusok
- CAST és CONVERT (Transact-SQL): Bizonyos dátumidő-átalakítások nem determinisztikusak
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.