Share via


datetime-Datentypkonvertierungen von C in SQL

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

In diesem Thema werden Probleme aufgeführt, die bei der Konvertierung von C-Typen in SQL Server Datums-/Uhrzeittypen zu berücksichtigen sind.

Die in der folgenden Tabelle beschriebenen Konvertierungen gelten für auf dem Client ausgeführte Konvertierungen. In Fällen, in denen der Client sekundenbruchteile Genauigkeit für einen Parameter angibt, der sich von dem auf dem Server definierten parameter unterscheidet, kann die Clientkonvertierung erfolgreich sein, aber der Server gibt einen Fehler zurück, wenn SQLExecute oder SQLExecuteDirect aufgerufen wird. Insbesondere behandelt ODBC jede Kürzung von Sekundenbruchteilen als Fehler, während das SQL Server Verhalten das Runden ist. Beispielsweise tritt eine Rundung auf, wenn Sie von datetime2(6) zu datetime2(2)wechseln. Werte der Datetime-Spalte werden auf 1/300 einer Sekunde gerundet, und für smalldatetime -Spalten werden Sekunden vom Server auf null festgelegt.

SQL_TYPE_DATE SQL_TYPE_TIME SQL_SS_TIME2 SQL_TYPE_TIMESTAMP SQL_SS_TIMSTAMPOFFSET SQL_CHAR SQL_WCHAR
SQL_C_DATE 1 - - 1,6 1,5,6 1,13 1,13
SQL_C_TIME - 1 1 1,7 1,5,7 1,13 1,13
SQL_C_SS_TIME2 - 1,3 1,10 1,7 1,5,7 1,13 1,13
SQL_C_BINARY(SQL_SS_TIME2_STRUCT) 1,10,11
SQL_C_TYPE_TIMESTAMP 1,2 1,3,4 1,4,10 1,10 1,5,10 1,13 1,13
SQL_C_SS_TIMESTAMPOFFSET 1,2,8 1,3,4,8 1,4,8,10 1,8,10 1,10 1,13 1,13
SQL_C_BINARY(SQL_SS_TIMESTAMPOFFSET_STRUCT) 1,10,11
SQL_C_CHAR/SQL_WCHAR (date) 9 9 9 9,6 9,5,6
SQL_C_CHAR/SQL_WCHAR (time2) 9 9,3 9,10 9,7,10 9,5,7,10
SQL_C_CHAR/SQL_WCHAR (datetime) 9,2 9,3,4 9,4,10 9,10 9,5,10
SQL_C_CHAR/SQL_WCHAR (datetimeoffset) 9,2,8 9,3,4,8 9,4,8,10 9,8,10 9,10
SQL_C_BINARY(SQL_DATE_STRUCT) 1,11
SQL_C_BINARY(SQL_TIME_STRUCT)
SQL_C_BINARY(SQL_TIMESTAMP_STRUCT)

Aufschlüsselung der Symbole

  • -: Es wird keine Konvertierung unterstützt. Es wird ein Diagnosedatensatz mit SQLSTATE 07006 und der Meldung "Attributverletzung beschränkter Datentypen" generiert.

  • 1: Wenn die angegebenen Daten ungültig sind, wird ein Diagnosedatensatz mit SQLSTATE 22007 und der Meldung "Ungültiges datetime-Format" generiert.

  • 2: Zeitfelder müssen null sein, oder ein Diagnosedatensatz wird mit SQLSTATE 22008 und der Meldung "Bruchkürzung" generiert.

  • 3: Sekundenbruchteile müssen null sein, oder ein Diagnosedatensatz wird mit SQLSTATE 22008 und der Meldung "Bruchkürzung" generiert.

  • 4: Die Datumskomponente wird ignoriert.

  • 5: Die Zeitzone wird auf die Zeitzoneneinstellung des Clients festgelegt.

  • 6: Die Zeit wird auf 0 (null) festgelegt.

  • 7: Das Datum wird auf das aktuelle Datum festgelegt.

  • 8: Die Zeit wird von der Zeitzone des Clients in UTC konvertiert. Tritt während dieser Konvertierung ein Fehler auf, wird ein Diagnosedatensatz mit SQLSTATE 22008 und der Meldung "Überlauf im Datetime-Feld" generiert.

  • 9: Die Zeichenfolge wird analysiert und in einen date-, datetime-, datetimeoffset- oder time-Wert konvertiert, abhängig vom ersten gefundenen Interpunktionszeichen und dem Vorhandensein der verbleibenden Komponenten. Die Zeichenfolge wird dann in den Zieltyp konvertiert. Dabei wird nach den Regeln in der vorangehenden Tabelle für den Quelltyp vorgegangen, der von diesem Prozess ermittelt wird. Wenn bei der Analyse der Daten ein Fehler ermittelt wird, wird ein Diagnosedatensatz mit SQLSTATE 22018 und der Meldung "Ungültiger Zeichenwert für Konvertierungsangabe" generiert. Wenn die Jahresangabe außerhalb des vom datetime- und smalldatetime-Parameter unterstützten Bereichs liegt, wird ein Diagnosedatensatz mit SQLSTATE 22007 und der Meldung "Ungültiges datetime-Format" generiert.

    Der Wert für datetimeoffset muss nach der Konvertierung in das UTC-Format innerhalb des gültigen Bereichs liegen und zwar selbst dann, wenn keine Konvertierung in UTC angefordert wird. Der Grund dafür ist, dass der TDS und der Server das Datum stets in datetimeoffset-Werte für UTC normalisieren, weshalb der Client prüfen muss, ob die Zeitkomponenten innerhalb des nach Konvertierung in UTC unterstützten Bereichs liegen. Wenn der Wert nicht innerhalb des unterstützten UTC-Bereichs liegt, wird ein Diagnosedatensatz mit SQLSTATE 22007 und der Meldung "Ungültiges datetime-Format" generiert.

  • 10: Wenn eine Abschneidung mit Datenverlust auftritt, wird ein Diagnosedatensatz mit SQLSTATE 22008 und der Meldung "Ungültiges Zeitformat" generiert. Dieser Fehler tritt auch dann auf, wenn der Wert außerhalb des Bereichs liegt, der vom UTC-Bereich, den der Server verwendet, dargestellt werden kann.

  • 11: Wenn die Bytelänge der Daten nicht der Größe der vom SQL-Typ erforderlichen Struktur entspricht, wird ein Diagnosedatensatz mit SQLSTATE 22003 und der Meldung "Numerischer Wert außerhalb des Bereichs" generiert.

  • 12: Wenn die Bytelänge der Daten 4 oder 8 beträgt, werden die Daten im unformatierten TDS-Format smalldatetime oder datetime an den Server gesendet. Wenn die Bytelänge der Daten exakt mit der Größe von SQL_TIMESTAMP_STRUCT übereinstimmt, werden die Daten in das TDS-Format für datetime2 konvertiert.

  • 13: Wenn eine Abschneidung mit Datenverlust auftritt, wird ein Diagnosedatensatz mit SQLSTATE 22001 und der Meldung "Zeichenfolgendaten, rechts abgeschnitten" generiert.

    Die Anzahl der Sekundenbruchteile (die Skalierung) wird anhand der Größe der Zielspalte gemäß der folgenden Tabelle bestimmt:

    Implizierte Dezimalstellen Implizierte Dezimalstellen
    Typ 0 1..9
    SQL_C_TYPE_TIMESTAMP 19 21..29

    Wenn die Sekundenbruchteile für SQL_C_TYPE_TIMESTAMP mit drei Ziffern ohne Datenverlust dargestellt werden können und die Spaltengröße 23 oder größer ist, werden genau drei Dezimalstellen für Sekundenbruchteile generiert. Dieses Verhalten stellt die Abwärtskompatibilität für Anwendungen sicher, die mit älteren ODBC-Treibern entwickelt wurden.

    Für Spaltengrößen, die den Bereich in der Tabelle übersteigen, werden 9 Dezimalstellen impliziert. Diese Konvertierung sollte bis zu neun Dezimalstellen für Sekundenbruchteile ermöglichen, das von ODBC zugelassene Maximum.

    Eine Spaltengröße von 0 (null) impliziert unendliche Größe für Zeichentypen mit variabler Länge in ODBC (9 Ziffern, sofern die 3-Ziffern-Regel für SQL_C_TYPE_TIMESTAMP nicht gilt). Die Angabe einer Spaltengröße von 0 (null) mit einem Zeichentyp fester Länge ist ein Fehler.

  • N/V: Vorhandenes SQL Server 2005 (9.x) und früheres Verhalten wird beibehalten.

Weitere Informationen

Verbesserungen bei Datum und Zeit (ODBC)