Datentypunterstützung für ODBC-Verbesserungen bei Datum/Uhrzeit
Dieses Thema liefert Informationen über ODBC-Typen, die die SQL Server-Datentypen date und time unterstützen.
Datentypzuordnung in Parametern und Resultsets
Neben den ODBC-Datentypen (SQL_TYPE_TIMESTAMP und SQL_TIMESTAMP) sind in SQL Server Native Client ODBC zwei neue Datentypen erforderlich, um die neuen Servertypen verfügbar zu machen:
SQL_SS_TIME2
SQL_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_BINARY |
SQL_BINARY (-2) |
SQL_SS_TIMESTAMPOFFSET |
SQL_SS_TIMESTAMPOFFSET_STRUCT |
SQL_C_BINARY |
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 stellt die Zuordnungen zwischen SQL Server-Datentypen, ODBC-Datentypen und ODBC-Zeichenfolgenliteralen dar.
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) bei Ausgabe und wird bei 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 |
'yyyy-mm-dd 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 (:).
An Anwendungen zurückgegebene Zeichenfolgenwerte 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 date/time-Literal 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 ohne 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 Monatsbereich reicht von 1 bis 12.
Der Tagesbereich liegt zwischen 1 und der Anzahl der Tage in dem betreffenden Monat und muss unter Berücksichtigung von Schaltjahren mit den Feldern für Jahr und Monat konsistent sein.
Der Stundenbereich reicht von 0 bis 23.
Der Minutenbereich reicht von 0 bis 59.
Der Sekundenbereich reicht von 0 bis 61.9(n). Es sind bis zu zwei Schaltsekunden erlaubt, um die Synchronisierung mit der Sideralzeit zu gewährleisten.
Beachten Sie, dass SQL Server keine Schaltsekunden zulässt. Sekundenwerte über 59 führen zu einem Serverfehler.
Implementierungen für die folgenden bestehenden ODBC-Strukturen wurden geändert, um die Unterstützung der neuen SQL Server-Datentypen date und date sicherzustellen. 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 ist neu in SQL Server 2008 und 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
Diese Struktur ist in SQL Server 2008 neu:
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 timezone_hour negativ ist, muss timezone_minute negativ oder 0 (null) sein. Wenn timezone_hour positiv ist, muss timezone_minute positiv oder 0 (null) sein. Wenn timezone_hour 0 (null) ist, kann timezone_minute jeden Wert im Bereich von -59 bis +59 annehmen.