Freigeben über


Datentypunterstützung für OLE DB-Datum-/Uhrzeit-Verbesserungen

Dieses Thema liefert Informationen über OLE DB (SQL Server Native Client)-Typen, die SQL Server-Datums- und Uhrzeitdatentypen unterstützen.

Datentypzuordnung zu Rowsets und Parametern

OLE DB stellt zwei neue Datentypen bereit, um die neuen Servertypen zu unterstützen: DBTYPE_DBTIME2 und DBTYPE_DBTIMESTAMPOFFSET. Die folgende Tabelle zeigt die vollständige Servertypzuordnung:

SQL Server-Datentyp

OLE DB-Datentyp

Wert

datetime

DBTYPE_DBTIMESTAMP

135 (oledb.h)

smalldatetime

DBTYPE_DBTIMESTAMP

135 (oledb.h)

date

DBTYPE_DBDATE

133 (oledb.h)

time

DBTYPE_DBTIME2

145 (sqlncli.h)

datetimeoffset

DBTYPE_DBTIMESTAMPOFFSET

146 (sqlncli.h)

datetime2

DBTYPE_DBTIMESTAMP

135 (oledb.h)

Datenformate: Zeichenfolgen und Literale

SQL Server-Datentyp

OLE DB-Datentyp

Zeichenfolgenformat für Clientkonvertierungen

datetime

DBTYPE_DBTIMESTAMP

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

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

smalldatetime

DBTYPE_DBTIMESTAMP

'yyyy-mm-dd hh:mm: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

DBTYPE_DBDATE

'yyyy-mm-dd'

time

DBTYPE_DBTIME2

'hh:mm:ss[.9999999]'

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

datetime2

DBTYPE_DBTIMESTAMP

'yyyy-mm-dd hh:mm:ss[.fffffff]'

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

datetimeoffset

DBTYPE_DBTIMESTAMPOFFSET

'yyyy-mm-dd hh:mm:ss[.fffffff] +/-hh:mm'

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

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

Sekundenbruchteile in Ergebnissen verwenden einen Punkt (.) und keinen Doppelpunkt (:).

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 ausgefüllt. Zwischen Datum und Uhrzeit und zwischen Zeit und Zeitzonenoffset ist jeweils genau eine Leerstelle. Ein Zeitzonenoffset wird immer mit einem Zeichen eingeleitet. Dieses Zeichen ist ein Plus (+), wenn der Offset 0 (null) ist. Es gibt keine Leerstellen zwischen dem Zeichen und dem Offsetwert. Sekundenbruchteile werden bei Bedarf bis zur definierten Genauigkeit für die Spalte mit nachfolgenden Nullen ausgefüllt, jedoch nicht weiter. 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).

Konvertierungen aus Zeichenfolgenwerten, die von der Anwendung bereitgestellt werden, sind flexibler und erlauben Komponentenwerte, die unter der maximalen Breite liegen. Jahre können aus 1-4 Ziffern bestehen. Monate, Tage, Stunden, Minuten und Sekunden können 1 oder 2 Ziffern haben. Es kann beliebig viele Leerstellen zwischen Datum-/Uhrzeit und Zeit-/Zeitzonenoffsets geben. Das Zeichen eines Offsets mit 0 (null) Stunden und 0 (null) Minuten kann Plus oder Minus sein. Nachfolgende Nullen sind bis zu einem Maximum von 9 Ziffern für Sekundenbruchteile zugelassen. Eine Zeitkomponente kann mit einem Dezimaltrennzeichen und keinen Ziffern für Sekundenbruchteile enden.

Eine leere Zeichenfolge ist kein gültiges Datum-/Uhrzeitliteral und stellt keinen NULL-Wert dar. Der Versuch, eine leere Zeichenfolge in einen Datum-/Uhrzeitwert zu konvertieren, führt Fehlern mit SQLSTATE 22018 und der Meldung „Ungültiger Zeichenwert für Konvertierungsangabe“.

Datenformate: Datenstrukturen

In den unten beschriebenen OLE DB-spezifischen Strukturen entspricht OLE DB den gleichen Einschränkungen wie ODBC. Diese werden vom gregorianischen Kalender genommen:

  • 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 Bereich für die Sekunden liegt zwischen 0 und 59. Es sind bis zu zwei Schaltsekunden erlaubt, um die Synchronisierung mit der Sideralzeit zu gewährleisten.

Implementierungen für die folgenden bestehenden OLE DB-Strukturen wurden geändert, um die Unterstützung der neuen SQL Server-Datum-/Uhrzeitdatentypen sicherzustellen. Die Definitionen haben sich jedoch nicht geändert.

  • DBTYPE_DATE (Dies ist ein Automatisierung-DATE-Typ. Er wird intern als double dargestellt. Der ganzzahlige Teil gibt die Anzahl von Tagen seit dem 30. Dezember 1899 wieder und der Bruchteil den Teil eines Tages. Dieser Typ hat eine Genauigkeit von 1 Sekunde und hat daher eine effektive Dezimalstelle von 0.)

  • DBTYPE_DBDATE

  • DBTYPE_DBTIME

  • DBTYPE_DBTIMESTAMP (das Bruchteilfeld wird von OLE DB als der milliardste Teil einer Sekunde (Nanosekunde) definiert, und der gültige Bereich liegt zwischen 0-999.999.999)

  • DBTYPE_FILETIME

DBTYPE_DBTIME2

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

typedef struct tagDBTIME2 {
    USHORT hour;
    USHORT minute;
    USHORT second;
    ULONG fraction;
    } DBTIME2;

DBTYPE_ DBTIMESTAMPOFFSET

typedef struct tagDBTIMESTAMPOFFSET {
    SHORT year;
    USHORT month;
    USHORT day;
    USHORT hour;
    USHORT minute;
    USHORT second;
    ULONG fraction;
    SHORT timezone_hour;
    SHORT timezone_minute;
    } DBTIMESTAMPOFFSET;

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 einen Wert zwischen -59 und +59 haben.

SSVARIANT

Diese Struktur enthält nun die neuen Strukturen DBTYPE_DBTIME2 und DBTYPE_ DBTIMESTAMPOFFSET und fügt Sekundenbruchteile für entsprechende Typen hinzu.

struct SSVARIANT {
   SSVARTYPE vt;
   DWORD dwReserved1;
   DWORD dwReserved2;
   union {
// ...
      DBTIMESTAMP tsDateTimeVal;
      DBDATE dDateVal;
      struct _Time2Val {
         DBTIME2 tTime2Val;
         BYTE bScale;
      } Time2Val;
      struct _DateTimeVal {
         DBTIMESTAMP tsDateTimeVal;
         BYTE bScale;
      } DateTimeVal;
      struct _DateTimeOffsetVal { 
         DBTIMESTAMPOFFSET tsoDateTimeOffsetVal;
         BYTE bScale;
      } DateTimeOffsetVal;
// ...
   };
};

Ferner wird die Enumeration, die dem SSVARIANT-Typ zugewiesen ist und den Enumerationstyp bestimmt, folgendermaßen erweitert:

enum SQLVARENUM {
// ...
   // Datetime
   VT_SS_DATETIME      = DBTYPE_DBTIMESTAMP,
   VT_SS_SMALLDATETIME = 206,

   VT_SS_DATE = DBTYPE_DBDATE,
   VT_SS_TIME2 = DBTYPE_DBTIME2,
   VT_SS_DATETIME2 = 212
   VT_SS_DATETIMEOFFSET = DBTYPE_DBTIMESTAMPOFFSET
};

Anwendungen, die zu SQL Server Native Client migriert werden, sql_variant verwenden und auf der eingeschränkten Genauigkeit von datetime beruhen, müssen aktualisiert werden, wenn des zugrunde liegende Schema auf die Verwendung von datetime2 anstelle von datetime aktualisiert wird.

Die Zugriffsmakros für SSVARIANT wurden durch Hinzufügen von Folgendem ebenfalls erweitert:

#define V_SS_DATETIME2(X)       V_SS_UNION(X, DateTimeVal)
#define V_SS_TIME2(X)           V_SS_UNION(X, Time2Val)
#define V_SS_DATE(X)            V_SS_UNION(X, dDateVal)
#define V_SS_DATETIMEOFFSET(X)  V_SS_UNION(X, DateTimeOffsetVal)

Datentypzuordnung zu ITableDefinition::CreateTable

Die folgende Typzuordnung wird mit DBCOLUMNDESC-Strukturen verwendet, die von ITableDefinition::CreateTable verwendet werden:

OLE DB-Datentyp (wType)

SQL Server-Datentyp

Hinweise

DBTYPE_DBDATE

date

DBTYPE_DBTIMESTAMP

datetime2(p)

Der SQL Server Native Client OLE DB-Anbieter überprüft das DBCOLUMDESC bScale-Element, um die Genauigkeit der Sekundenbruchteile festzustellen.

DBTYPE_DBTIME2

time(p)

Der SQL Server Native Client OLE DB-Anbieter überprüft das DBCOLUMDESC bScale-Element, um die Genauigkeit der Sekundenbruchteile festzustellen.

DBTYPE_DBTIMESTAMPOFFSET

datetimeoffset(p)

Der SQL Server Native Client OLE DB-Anbieter überprüft das DBCOLUMDESC bScale-Element, um die Genauigkeit der Sekundenbruchteile festzustellen.

Wenn eine Anwendung DBTYPE_DBTIMESTAMP in wType festlegt, kann die Zuordnung zu datetime2 überschrieben werden, indem in pwszTypeName ein Typname angegeben wird. Wenn datetime angegeben wird, muss bScale 3 sein. Wenn smalldatetime angegeben wird, muss bScale 0 sein. Wenn bScale nicht konsistent mit wType und pwszTypeName ist, wird DB_E_BADSCALE zurückgegeben.