Teilen über


datetime-Datentypkonvertierungen von C in SQL

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics Analytics Platform System (PDW)

In diesem Thema werden Probleme aufgeführt, die Sie berücksichtigen sollten, wenn Sie von C-Typen in SQL Server-Datums-/Uhrzeittypen konvertieren.

Die in der folgenden Tabelle beschriebenen Konvertierungen gelten für auf dem Client ausgeführte Konvertierungen. In Fällen, in denen der Client eine Bruch sekundengenaue Genauigkeit für einen Parameter angibt, der sich von dem auf dem Server definierten unterscheidet, kann die Clientkonvertierung erfolgreich sein, der Server gibt jedoch einen Fehler zurück, wenn SQLExecute oder SQLExecuteDirect aufgerufen wird. Insbesondere behandelt ODBC jede Abkürzung von Bruchsekunden als Fehler, während das SQL Server-Verhalten gerundet werden soll; Beispielsweise tritt das Runden 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 (Datum) 9 9 9 9,6 9,5,6
SQL_C_CHAR/SQL_WCHAR (Zeit2) 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 bereitgestellten 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 "Bruchbruch" generiert.

  • 3: Bruch sekunden müssen null sein oder ein Diagnosedatensatz wird mit SQLSTATE 22008 und der Meldung "Bruchbruch" generiert.

  • 4: Die Datumskomponente wird ignoriert.

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

  • 6: Die Zeit ist auf Null festgelegt.

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

  • 8: Die Zeit wird aus 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 Datums-, Datetime-, Datetimeoffset- oder Zeitwert konvertiert, je nach dem ersten Interpunktionszeichen, das aufgetreten ist, 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 das Abschneiden 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 struktur entspricht, die vom SQL-Typ benötigt wird, 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 Smalldatetime- oder Datetime-Format 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 ein Abschneiden mit Datenverlust auftritt, wird ein Diagnosedatensatz mit SQLSTATE 22001 generiert und die Meldung "Zeichenfolgendaten, rechts abgeschnitten".

    Die Anzahl der Bruchteilsekunden (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/A: Vorhandenes SQL Server 2005 (9.x) und früheres Verhalten werden beibehalten.

Weitere Informationen

Verbesserungen bei Datum und Zeit (ODBC)