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