Поделиться через


Улучшения поддержки типов данных даты-времени OLE DB

В этом разделе содержатся сведения о типах OLE DB (собственного клиента SQL Server), которые поддерживают типы данных даты-времени SQL Server.

Сопоставление типов данных в наборах строк и параметрах

OLE DB предоставляет два новых типа данных для поддержки серверов новых типов: DBTYPE_DBTIME2 и DBTYPE_DBTIMESTAMPOFFSET. Следующая таблица отображает полное сопоставление типов серверов.

Тип данных SQL Server

Тип данных OLE DB

Значение

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)

Форматы данных: строки и литералы

Тип данных SQL Server

Тип данных OLE DB

Формат строки для клиентских преобразований

datetime

DBTYPE_DBTIMESTAMP

'гггг-мм-дд чч:мм:сс:[.999]'

SQL Server для типа Datetime поддерживает значения долей секунды, состоящие из не более чем трех цифр.

smalldatetime

DBTYPE_DBTIMESTAMP

'гггг-мм-дд чч:мм:сс'

Точность этого типа данных составляет одну минуту. При выводе данных секунды будут равны нулю, а при вводе данных они округляются сервером.

date

DBTYPE_DBDATE

'гггг-мм-дд'

time

DBTYPE_DBTIME2

'чч:мм:сс[.9999999]'

Дополнительно можно указывать доли секунд до семи цифр.

datetime2

DBTYPE_DBTIMESTAMP

'гггг-мм-дд чч:мм:сс[.еееееее]'

Дополнительно можно указывать доли секунд до семи цифр.

datetimeoffset

DBTYPE_DBTIMESTAMPOFFSET

'гггг-мм-дд чч:мм:сс[.еееееее] +/-чч:мм'

Дополнительно можно указывать доли секунд до семи цифр.

В escape-последовательностях для литералов даты и времени изменений нет.

Для долей секунды в результатах используется точка (.), а не двоеточие (:).

Строковые значения, возвращаемые в приложения, всегда будут иметь одинаковую длину для данного столбца. Компоненты года, месяца, дня, часа, минуты и секунды дополняются ведущими нулями до максимальной длины. Между значениями даты и времени имеется точно один пробел, а также предусмотрен точно один пробел между значением времени и смещением часового пояса. Перед смещением часового пояса всегда должен стоять знак. Это знак «плюс» (+), если смещение равен нулю. Пробелы между знаком и значением смещения отсутствуют. Доли секунды дополняются замыкающими нулями при необходимости до заданной точности столбца, но не более. Для столбцов datetime количество цифр с обозначением долей секунды равно трем. Для столбцов smalldatetime цифры с обозначением долей секунды отсутствуют, а секунды всегда равны нулю.

Приложения позволяют применять более гибкие преобразования из строковых значений, а также обеспечивают возможность использования значений компонентов с меньшей шириной по сравнению с максимальной. Годы могут быть представлены цифрами в количестве от 1 до 4. Месяцы, дни, часы, минуты и секунды могут быть представлены 1 или 2 цифрами. Между значениями даты и времени, а также значением времени и смещением часового пояса может находиться произвольное число пробелов. Смещение, равное нулю часов и нулю минут, может иметь знак плюс или минус. Допускается использование замыкающих нулей для долей секунд вплоть до максимального количества цифр, равного 9. Время может завершаться десятичной запятой без указания цифр долей секунды.

Пустая строка не является допустимым литералом даты-времени, она не представляет значение NULL. Попытка преобразовать пустую строку в значение даты-времени приведет к ошибкам со значением SQLState, равным 22018, и сообщением «Недопустимое символьное значение для спецификации приведения».

Форматы данных: структуры данных

В структурах, зависящих от поставщика OLE DB, на OLE DB налагаются те же ограничения, что и на ODBC. Следующие определения взяты из описания григорианского календаря.

  • Диапазон месяцев — от 1 до 12 включительно.

  • Диапазон поля даты — от 1 до количества дней в месяце включительно, он должен быть согласован с полями года и месяца с учетом високосного года.

  • Диапазон часов — от 0 до 23 включительно.

  • Диапазон минут — от 0 до 59 включительно.

  • Диапазон секунд — от 0 до 59. Это позволяет использовать до двух корректировочных секунд для синхронизации со звездным временем.

Реализации следующих существующих структур OLE DB были изменены в целях совместимости с новыми типами данных даты и времени SQL Server. При этом определения не изменились.

  • DBTYPE_DATE (Тип автоматизации DATE. Имеет внутреннее представление double. Целая часть числа равна числу дней, прошедшему с 30 декабря 1899 г., а десятичная часть равна части дня. Точность этого типа составляет 1 секунду, поэтому значение масштаба фактически равно 0.)

  • DBTYPE_DBDATE

  • DBTYPE_DBTIME

  • DBTYPE_DBTIMESTAMP (Поле дробной части определяется в OLE DB как число миллиардных долей секунды (наносекунд) и имеет диапазон от 0 до 999 999 999.)

  • DBTYPE_FILETIME

DBTYPE_DBTIME2

Эта структура дополняется до 12 байт как в 32-разрядных, так и в 64-разрядных операционных системах.

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;

Если значение timezone_hour отрицательно, значение timezone_minute должно быть отрицательным или нулевым. Если значение timezone_hour положительно, значение timezone minute должно быть положительным или нулевым. Если значение timezone_hour равно нулю, timezone minute может содержать значение от -59 до +59.

SSVARIANT

Эта структура изменена и теперь содержит новые типы DBTYPE_DBTIME2 и DBTYPE_DBTIMESTAMPOFFSET, а также шкалу дробных долей секунды для соответствующих типов.

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;
// ...
   };
};

Кроме того, перечисление, связанное с типом шифрования SSVARIANT, который определяет тип перечисления, будет расширено следующим образом:

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
};

Приложения, переводимые на использование собственного клиента SQL Server, которые используют тип данных sql_variant и ограниченную точность datetime, должны быть обновлены, если базовая схема обновлена для использования типа данных datetime2 вместо datetime.

Макрос доступа SSVARIANT также расширен с помощью следующего дополнения:

#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)

Сопоставление типов данных в методе ITableDefinition::CreateTable

Следующее сопоставление типов используется со структурами DBCOLUMNDESC в методе ITableDefinition::CreateTable.

Тип данных OLE DB (wType)

Тип данных SQL Server

Примечания

DBTYPE_DBDATE

date

DBTYPE_DBTIMESTAMP

datetime2(p)

Поставщик OLE DB для собственного клиента SQL Server проверяет элемент DBCOLUMDESC bScale, пытаясь определить точность долей секунды.

DBTYPE_DBTIME2

time(p)

Поставщик OLE DB для собственного клиента SQL Server проверяет элемент DBCOLUMDESC bScale, пытаясь определить точность долей секунды.

DBTYPE_DBTIMESTAMPOFFSET

datetimeoffset(p)

Поставщик OLE DB для собственного клиента SQL Server проверяет элемент DBCOLUMDESC bScale, пытаясь определить точность долей секунды.

Если приложение задает DBTYPE_DBTIMESTAMP в wType, оно может заменить сопоставление с datetime2 новым сопоставлением, предоставив имя типа в pwszTypeName. Если указан тип данных datetime, параметр bScale должен быть равен 3. Если указан тип данных smalldatetime, параметр bScale должен быть равен 0. Если параметр bScale не согласован с выбранным wType и pwszTypeName, возвращается значениеDB_E_BADSCALE.

См. также

Основные понятия