Поддержка типов данных для улучшений типов даты-времени ODBC
Этот раздел содержит сведения о типах ODBC, поддерживающих типы данных даты и времени SQL Server.
Сопоставление типов данных в параметрах и результирующих наборах
Кроме типов данных ODBC (SQL_TYPE_TIMESTAMP и SQL_TIMESTAMP), ODBC-драйверу для собственного клиента SQL Server требуются два новых типа данных для представления новых типов серверов.
SQL_SS_TIME2
SQL_TIMESTAMPOFFSET
В следующей таблице показано полное сопоставление серверных типов данных. Обратите внимание, что некоторые ячейки таблицы содержат по две записи. В таких случаях первая запись – это значение ODBC 3.0, а второе – значение ODBC 2.0.
Тип данных SQL Server |
Тип данных SQL |
Значение |
---|---|---|
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) |
В следующей таблицы приведены соответствующие структуры и типы ODBC C. Поскольку ODBC не разрешает типы C, определяемые драйвером, SQL_C_BINARY используется для представления данных time и datetimeoffset как двоичных структур.
Тип данных SQL |
Организация памяти |
Тип данных C по умолчанию |
Значение (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) |
Если определена привязка SQL_C_BINARY, будет выполнена проверка выравнивания и в случае неправильного выравнивания будет выдана ошибка. SQLSTATE для этой ошибки будет IM016, с сообщением «Неправильное выравнивание структуры».
Форматы данных: строки и литералы
В следующей таблицы показано сопоставление типов данных SQL Server, ODBC и строковых литералов ODBC.
Тип данных SQL Server |
тип данных ODBC |
Формат строки для клиентских преобразований |
---|---|---|
Datetime |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
'yyyy-mm-dd hh:mm:ss:[.999]' SQL Server поддерживает значение типа Datetime, состоящее из не более чем трех цифр. |
Smalldatetime |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
'yyyy-mm-dd hh:hh:ss' Точность этого типа данных составляет одну минуту. При выводе данных секунды будут равны нулю, а при вводе данных они округляются сервером. |
Date |
SQL_TYPE_DATE SQL_DATE |
'yyyy-mm-dd' |
Time |
SQL_SS_TIME2 |
'hh:mm:ss[.9999999]' Дополнительно можно указывать доли секунд до семи цифр. |
Datetime2 |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
'yyyy-mm-dd hh:mm:ss:[0,9999999]' Дополнительно можно указывать доли секунд до семи цифр. |
DatetimeOFFSET |
SQL_SS_TIMESTAMPOFFSET |
'yyyy-mm-dd hh:mm:ss[.9999999] +/- hh:mm' Дополнительно можно указывать доли секунд до семи цифр. |
В escape-последовательностях ODBC для литералов даты-времени изменений нет.
Для обозначения долей секунды в результатах всегда используется точка (.), а не двоеточие (:).
Возвращаемые приложениям строковые значения всегда имеют одинаковую длину для заданного столбца. Компонентам года, месяца, дня, часа, минуты и секунды предшествуют нули для достижения максимальной длины, а в значениях datetime между датой и временем присутствует один пробел. Также один пробел имеется между временем и сдвигом часового пояса в значении datetimeoffset. Перед сдвигом часового пояса всегда стоит знак. Если сдвиг равен нулю, ставится плюс (+). Доли секунды при необходимости дополняются замыкающими нулями до заданной точности столбца. В столбцах datetime для долей секунды предназначены три цифры. В столбцах smalldatetime цифр для долей секунд не предусмотрено, а секунды всегда обозначаются нулями.
Пустая строка не является допустимым литералом даты-времени, она не представляет значение NULL. Попытка преобразования пустой строки в значение даты-времени приведет к возникновению ошибки SQLState 22018 и появлению сообщения «Недопустимое значение символа для указания приведения».
При преобразовании из строковых параметров ожидаются строки в одинаковом формате, за исключением того, что если для часового пояса и часы, и минуты обозначены нулями, то перед элементом может стоять как плюс, так и минус, а для долей секунд разрешено использовать замыкающие нули до 9 цифр. Время может завершаться десятичной запятой без указания цифр долей секунды.
В настоящее время драйвер допускает использование дополнительного пробела рядом со знаком препинания, а пробел между временем и часовым поясом является необязательным. Однако в следующих выпусках это может быть изменено. Приложениям не следует полагаться на текущее поведение.
Форматы данных: Структуры данных
В описанных ниже структурах ODBC указывает следующие контейнеры, взятые из григорианского календаря.
Диапазон месяцев — от 1 до 12 включительно.
Диапазон поля даты — от 1 до количества дней в месяце включительно, он должен быть согласован с полями года и месяца с учетом високосного года.
Диапазон часов — от 0 до 23 включительно.
Диапазон минут — от 0 до 59 включительно.
Диапазон секунд — от 0 до 61.9(n) включительно. Допускается до двух корректировочных секунд для поддержки синхронизации со звездным временем.
Следует иметь в виду, что SQL Server не допускает использования корректировочных секунд, поэтому значения секунд больше 59 приведут к ошибке.
Реализации следующих существующих структур ODBC были изменены для поддержки новых типов данных времени и даты в SQL Server. При этом определения не изменились.
DATE_STRUCT
TIME_STRUCT
TIMESTAMP_STRUCT
Также добавлены две новые структуры.
SQL_SS_TIME2_STRUCT
SQL_SS_TIMESTAMPOFFSET_STRUCT
SQL_SS_TIME2_STRUCT
В SQL Server 2008 эта структура является новой, она дополняется до 12 байт как в 32-разрядных, так и в 64-разрядных операционных системах.
typedef struct tagSS_TIME2_STRUCT { SQLUSMALLINT hour; SQLUSMALLINT minute; SQLUSMALLINT second; SQLUINTEGER fraction;} SQL_SS_TIME2_STRUCT;
SQL_SS_TIMESTAMPOFFSET_STRUCT
В SQL Server 2008 эта структура является новой.
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;
Если значение timezone_hour отрицательное, значение timezone_minute также должно быть отрицательным или равным нулю. Если значение timezone_hour положительное, значение timezone_minute должно быть положительным или равным нулю. Если значение timezone_hour равно нулю, значение timezone_minute может быть любым в диапазоне от -59 до +59 включительно.