Datentypunterstützung für ODBC-Verbesserungen bei Datum und Uhrzeit

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

Dieses Thema enthält Informationen zu ODBC-Typen, die SQL Server Datums- und Uhrzeitdatentypen unterstützen.

Datentypzuordnung in Parametern und Resultsets

Zusätzlich zu den ODBC-Datentypen (SQL_TYPE_TIMESTAMP und SQL_TIMESTAMP) wurden in SQL Server Native Client ODBC zwei neue Datentypen hinzugefügt, um die neuen Servertypen verfügbar zu machen:

  • SQL_SS_TIME2

  • SQL_SS_TIMESTAMPOFFSET

Die folgende Tabelle zeigt die vollständige Servertypzuordnung. Beachten Sie, dass einige Zellen der Tabelle zwei Einträge enthalten. In diesen Fällen ist der erste der ODBC 3.0-Wert und der zweite der ODBC 2.0-Wert.

SQL Server-Datentyp SQL-Datentyp Wert
Datetime SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
93 (sql.h)

11 (sqlext.h)
Smalldatetime SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
93 (sql.h)

11 (sqlext.h)
Date SQL_TYPE_DATE

SQL_DATE
91 (sql.h)

9 (sqlext.h)
Time SQL_SS_TIME2 -154 (SQLNCLI.h)
DatetimeOFFSET SQL_SS_TIMESTAMPOFFSET -155 (sqlncli.h)
Datetime2 SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
93 (sql.h)

11 (sqlext.h)

In der folgenden Tabelle sind die entsprechenden Strukturen und ODBC C-Typen aufgeführt. Da ODBC keine treiberdefinierten C-Typen zulässt, wird SQL_C_BINARY als Binärstrukturen für time und datetimeoffset verwendet.

SQL-Datentyp Speicherlayout Standardmäßiger C-Datentyp Wert (sqlext.h)
SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
SQL_TIMESTAMP_STRUCT

TIMESTAMP_STRUCT
SQL_C_TYPE_TIMESTAMP

SQL_C_TIMESTAMP
SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
SQL_TYPE_DATE

SQL_DATE
SQL_DATE_STRUCT

DATE_STRUCT
SQL_C_TYPE_DATE

SQL_C_DATE
SQL_TYPE_DATE

SQL_DATE
SQL_SS_TIME2 SQL_SS_TIME2_STRUCT SQL_C_SS_TIME2

SQL_C_BINARY (ODBC 3.5 und früher)
0x4000 (sqlncli.h)

SQL_BINARY (-2)
SQL_SS_TIMESTAMPOFFSET SQL_SS_TIMESTAMPOFFSET_STRUCT SQL_C_SS_TIMESTAMPOFFSET

SQL_C_BINARY (ODBC 3.5 und früher)
0x4001 (sqlncli.h)

SQL_BINARY (-2)

Wenn die SQL_C_BINARY-Bindung angegeben wird, wird die Ausrichtungsüberprüfung ausgeführt und ein eventueller Fehler berichtet. Der SQLSTATE für diesen Fehler ist IM016, mit der Meldung "Falsche Strukturausrichtung".

Datenformate: Zeichenfolgen und Literale

Die folgende Tabelle zeigt die Zuordnungen zwischen SQL Server Datentypen, ODBC-Datentypen und ODBC-Zeichenfolgenliteralen.

SQL Server-Datentyp ODBC-Datentyp Zeichenfolgenformat für Clientkonvertierungen
Datetime SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
'yyyy-mm-dd hh:mm:ss[.999]'

SQL Server unterstützt bis zu drei Sekundenbruchteilziffern für Datetime.
Smalldatetime SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
'yyyy-mm-dd hh:hh:ss'

Dieser Datentyp verfügt über eine Genauigkeit von einer Minute. Die zweite Komponente ist 0 (null) auf Ausgabe und wird auf Eingabe vom Server gerundet.
Date SQL_TYPE_DATE

SQL_DATE
'yyyy-mm-dd'
Time SQL_SS_TIME2 'hh:mm:ss[.9999999]'

Sekundenbruchteile können optional mit bis zu sieben Ziffern angegeben werden.
Datetime2 SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
'jjjj-mm-tt hh:mm:ss[.9999999]'

Sekundenbruchteile können optional mit bis zu sieben Ziffern angegeben werden.
DatetimeOFFSET SQL_SS_TIMESTAMPOFFSET 'yyyy-mm-dd hh:mm:ss[.9999999] +/- hh:mm'

Sekundenbruchteile können optional mit bis zu sieben Ziffern angegeben werden.

Für date/time-Literale gibt es keine Änderungen der ODBC-Escapesequenzen.

Sekundenbruchteile in Ergebnissen verwenden immer einen Punkt (.) anstelle eines Doppelpunkts (:).

Zeichenfolgenwerte, die an Anwendungen zurückgegeben werden, haben immer die gleiche Länge für eine bestimmte Spalte. Die Komponenten Jahr, Monat, Tag, Stunde, Minute und Sekunde werden mit führenden Nullen bis zur maximalen Breite aufgefüllt. Zudem befindet sich zwischen Datum und Uhrzeit in datetime-Werten ein Leerzeichen. Auch zwischen dem Uhrzeit- und Zeitzonenoffset in einem datetimeoffset-Wert steht ein Leerzeichen. Einem Zeitzonenoffset wird immer ein Zeichen vorangestellt. Wenn der Offset 0 (null) ist, ist das Zeichen ein Plus (+). Sekundenbruchteile werden bei Bedarf bis zur definierten Genauigkeit für die Spalte mit nachfolgenden Nullen aufgefüllt. Für datetime-Spalten gibt es drei Ziffern für Sekundenbruchteile. Für smalldatetime-Spalten gibt es keine Ziffern für Sekundenbruchteile, und die Sekunden sind immer 0 (null).

Eine leere Zeichenfolge ist kein gültiges Datum-/Uhrzeitliteral und stellt keinen NULL-Wert dar. Der Versuch, eine leere Zeichenfolge in einen date/time-Wert zu konvertieren, führt zum Fehler SQLSTATE 22018 und der Meldung "Ungültiger Zeichenwert für Konvertierungsangabe".

Konvertierungen aus Zeichenfolgenparametern setzen Zeichenfolgen im selben Format voraus. Ausnahmen: Das Zeichen einer Zeitzone mit 0 (null) Stunden und 0 (null) Minuten kann entweder Plus oder Minus sein, und nachfolgende Nullen sind für Sekundenbruchteile bis zu maximal 9 Ziffern zulässig. Eine Zeitkomponente kann mit einem Dezimaltrennzeichen und keinen Ziffern für Sekundenbruchteile enden.

Aktuell lässt der Treiber zusätzliche Leerzeichen um Satzzeichen zu, und das Leerzeichen zwischen dem Uhrzeit- und dem Zeitzonenoffset ist optional. Aber dies könnte sich in einer zukünftigen Version ändern; Anwendungen sollten das aktuelle Verhalten nicht bedingen.

Datenformate: Datenstrukturen

In den nachfolgend beschriebenen Strukturen gibt ODBC die folgenden Einschränkungen an, die auf den gregorianischen Kalender zurückgehen:

  • Der Bereich für den Monat liegt zwischen 1 und 12.

  • Der Bereich für das Tagfeld liegt zwischen 1 und der Anzahl Tage in dem Monat und muss mit den Feldern für Jahr und Monat konsistent sein unter Berücksichtigung von Schaltjahren.

  • Der Bereich für die Stunden liegt zwischen 0 und 23.

  • Der Bereich für die Minuten liegt zwischen 0 und 59.

  • Der Sekundenbereich reicht von 0 bis 61.9(n). Es sind bis zu zwei Schaltsekunden erlaubt, um die Synchronisierung mit der Sternzeit zu gewährleisten.

    Beachten Sie, dass SQL Server keine Schaltsekunden zulässt, sodass sekundengenaue Sekunden größer als 59 einen Serverfehler verursachen.

Implementierungen für die folgenden vorhandenen ODBC-Strukturen wurden geändert, um die neuen datentypen SQL Server Datum und Uhrzeit zu unterstützen. Die Definitionen haben sich jedoch nicht geändert.

  • DATE_STRUCT

  • TIME_STRUCT

  • TIMESTAMP_STRUCT

Es gibt zudem zwei neue Strukturen:

  • SQL_SS_TIME2_STRUCT

  • SQL_SS_TIMESTAMPOFFSET_STRUCT

SQL_SS_TIME2_STRUCT

Diese Struktur wird auf beiden Betriebssystemen (32 Bit und 64 Bit) bis 12 Byte aufgefüllt.

typedef struct tagSS_TIME2_STRUCT {  
   SQLUSMALLINT hour;  
   SQLUSMALLINT minute;  
   SQLUSMALLINT second;  
   SQLUINTEGER fraction;  
} SQL_SS_TIME2_STRUCT;  

SQL_SS_TIMESTAMPOFFSET_STRUCT

typedef struct tagSS_TIMESTAMPOFFSET_STRUCT {  
   SQLSMALLINT year;  
   SQLUSMALLINT month;  
   SQLUSMALLINT day;  
   SQLUSMALLINT hour;  
   SQLUSMALLINT minute;  
   SQLUSMALLINT second;  
   SQLUINTEGER fraction;  
   SQLSMALLINT timezone_hour;  
   SQLSMALLINT timezone_minute;  
} SQL_SS_TIMESTAMPOFFSET_STRUCT;  

Wenn der timezone_hour negativ ist, muss der timezone_minute negativ oder null sein. Wenn der timezone_hour positiv ist, muss der timezone_minute positiv oder null sein. Wenn der timezone_hour null ist, kann der timezone_minute einen beliebigen Wert im Bereich von -59 bis +59 aufweisen.

Weitere Informationen

Verbesserungen bei Datum und Zeit (ODBC)