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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Tickets als Feedbackmechanismus für Inhalte auslaufen lassen und es durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unter:Einreichen und Feedback anzeigen für