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.