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


Улучшения поддержки типов данных даты-времени 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

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

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

smalldatetime

DBTYPE_DBTIMESTAMP

'yyyy-mm-dd hh:mm:ss'

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

date

DBTYPE_DBDATE

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

time

DBTYPE_DBTIME2

'hh:mm:ss[.9999999]'

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

datetime2

DBTYPE_DBTIMESTAMP

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

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

datetimeoffset;

DBTYPE_DBTIMESTAMPOFFSET

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

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

В SQL Server 2008 не появилось никаких изменений управляющих последовательностей для литералов даты-времени.

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

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

Преобразования из строковых значений, предоставленные приложением, будут более гибкими и позволят значения компонентов с меньшей шириной, нежели максимальная. Годы могут быть представлены 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

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

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

DBTYPE_ DBTIMESTAMPOFFSET

В SQL Server 2008 эта структура является новой.

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

Эта структура была изменена в SQL Server 2008 и дополнена новыми структурами, 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 2008, которые используют 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.

См. также

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