Nicht deterministische Konvertierung von Datumsliteralen in DATE-WerteNondeterministic conversion of literal date strings into DATE values

Seien Sie vorsichtig, wenn Sie die Konvertierung Ihrer CHARACTER-Zeichenfolgen in DATE-Datentypen zulassen.Use caution when allowing conversion of your CHARACTER strings into DATE data types. Der Grund dafür ist, dass solche Konvertierungen oft nicht deterministisch sind.The reason is that such conversions are often nondeterministic.

Sie steuern diese nicht deterministischen Konvertierungen, indem Sie die Einstellungen von SET LANGUAGE und SET DATEFORMAT berücksichtigen.You control these nondeterministic conversions by accounting for the settings of SET LANGUAGE and SET DATEFORMAT.

Beispiel für SET LANGUAGE: Monatsname in polnischer SpracheSET LANGUAGE example: Month name in Polish

  • SET LANGUAGE Polish;

Eine Zeichenfolge kann der Name eines Monats sein.A character string can be the name of a month. Aber ist der Name in englischer, polnischer, kroatischer oder einer anderen Sprache?But is the name in English, or Polish, or Croatian, or in another language? Und wird die Sitzung des Benutzers auf die richtige entsprechende SPRACHE festgelegt?And, will the user's session be set to the correct corresponding LANGUAGE?

Nehmen Sie z. B. das Wort listopad, das der Name eines Monats ist.For example, consider the word listopad, which is the name of a month. Aber welcher Monat es ist, hängt von der Sprache ab, von der das SQL Server-System glaubt, dass sie verwendet wird:But which month it is depends on the language the SQL system believes is being used:

  • Falls Polnisch, steht listopad für den 11. Monat (November auf Englisch).If Polish, then listopad translates to month 11 (November in English).
  • Falls Kroatisch, steht listopad für den 10. Monat (Oktober auf Englisch).If Croatian, then listopad translates to month 10 (October in English).

Codebeispiel für SET LANGUAGECode example of 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
***/

Beispiel für SET DATEFORMATSET DATEFORMAT example

  • SET DATEFORMAT dmy;

Das voranstehende dmy-Format besagt, dass z. B. die Datumszeichenfolge '01-03-2018' so interpretiert wird, dass sie den ersten Tag im März im Jahr 2018 bedeutet.The preceding dmy format says that an example date string of '01-03-2018' would be interpreted to mean the first day of March in the year 2018.

Wenn stattdessen mdy angegeben wird, würde die gleiche Zeichenfolge '01-03-2018' _ den dritten Tag im Januar 2018_ bedeuten.If instead mdy was specified, then the same '01-03-2018' string would mean the third day of January in 2018.

Und wenn ymd angegeben würde, gibt es keine Garantie dafür, wie die Ausgabe aussehen würde.And if ymd was specified, there is no guarantee of what the output would be. Der numerische Wert '2018' ist zu groß für einen Tag.The numeric value of '2018' is too large to be a day.

Bestimmte LänderSpecific countries

In Japan und China wird das DATEFORMAT ymd verwendet.In Japan and China, the DATEFORMAT of ymd is used. Die Teile des Formats befinden sich in einer sinnvollen Reihenfolge von der größten Einheit zur kleinsten.The format's parts are in a sensible sequence of largest unit to smallest. Daher lässt sich dieses Format gut sortieren.Consequently, this format sorts well. Dieses Format gilt als internationales Format.This format is considered to be the international format. Es ist international, weil die vier Ziffern des Jahres eindeutig sind und kein Land der Erde das archaische Format ydm verwendet.It is international because the four digits of the year are unambiguous, and no country on Earth uses the archaic format of ydm.

In anderen Ländern wie Deutschland und Frankreich ist das DATEFORMAT dmy, was 'TT.MM.JJJJ' bedeutet.In other countries such as Germany and France, the DATEFORMAT is dmy, meaning 'dd-mm-yyyy'. Das dmy-Format lässt sich nicht gut sortieren, aber es ist eine sinnvolle Reihenfolge von der kleinsten bis zur größten Einheit.The dmy format does not sort well, but it is a sensible sequence of smallest unit to largest.

Die USA und die Föderierten Staaten von Mikronesien sind die einzigen Länder, die mdy verwenden, was sich nicht sortieren lässt.The United States, and the Federated States of Micronesia, are the only countries that use mdy, which does not sort. Die gemischte Reihenfolge des Formats entspricht einem Muster mündlicher Sprache in gesprochenen Datumsangaben.The format's mixed sequence matches a pattern of verbal speech in spoken dates.

Codebeispiel für die SET DATEFORMAT: mdy im Vergleich zu dmyCode example of SET DATEFORMAT: mdy versus dmy

Das folgende Transact-SQL-Codebeispiel verwendet die gleiche Datumszeichenfolge mit drei unterschiedlichen DATEFORMAT-Einstellungen.The following Transact-SQL code example uses the same date character string with three different DATEFORMAT settings. Bei Ausführung des Codes wird die im Kommentar gezeigte Ausgabe generiert:A run of the code produces the output shown in the comment:

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
***/

Im vorhergehenden Codebeispiel weist das letzte Beispiel eine Nichtübereinstimmung zwischen dem Format ymd und der Eingabezeichenfolge auf.In the preceding code example, the final example has a mismatch between format ymd versus the input string. Der dritte Knoten der Eingabezeichenfolge stellt einen Zahlenwert dar, der für einen Tag zu groß ist.The third node of the input string represents a numeric value that is too large to be a day. Bei solchen Nichtübereinstimmungen garantiert Microsoft nicht den Ausgabewert.Microsoft does not guarantee the output value from such mismatches.

CONVERT bietet explizite Codes für die deterministische Steuerung von Datumsformaten.CONVERT offers explicit codes for deterministic control of date formats

Unser Dokumentationsartikel zu CAST und CONVERT enthält explizite Codes, die Sie mit der CONVERT-Funktion verwenden können, um Datumskonvertierungen deterministisch zu steuern.Our CAST and CONVERT documentation article lists explicit codes that can you can use with the CONVERT function to deterministically control date conversions. Jeden Monat hat der Artikel eine der höchsten Zugriffszahlen.Every month the article has one of our highest pageview counts.

Kompatibilitätsgrad 90 und höherCompatibility level 90 and above

Bei SQL Server 2000 war der Kompatibilitätsgrad 80.In SQL Server 2000, the compatibility level was 80. Für Gradeinstellungen von 80 oder niedriger waren implizite Datumskonvertierungen deterministisch.For level settings of 80 or below, implicit date conversions were deterministic.

Ab SQL Server 2005 und dessen Kompatibilitätsgrad 90 wurden implizite Datumskonvertierungen nicht mehr deterministisch.Starting with SQL Server 2005 and its compatibility level of 90, implicit date conversions became nondeterministic. Ab Grad 90 wurden die Datumskonvertierungen von SET LANGUAGE und SET DATEFORMAT abhängig.Date conversions became dependent on SET LANGUAGE and SET DATEFORMAT starting with level 90.

UnicodeUnicode

Die Konvertierung von Nicht-Unicode-Zeichendaten zwischen Sortierungen wird auch als nicht deterministisch angesehen.Conversion of non-Unicode character data between collations is also considered nondeterministic.

Weitere InformationenSee also