Преобразования типа данных datetime из C в SQL

Применимо к:SQL ServerAzure SQL DatabaseAzure Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

В этом разделе перечислены проблемы, которые следует учитывать при преобразовании типов C в типы даты и времени SQL Server.

Преобразования, описанные в следующей таблице, относятся к преобразованиям, совершаемым на клиенте. В случаях, когда клиент указывает дробную секунду точности для параметра, который отличается от указанного на сервере, преобразование клиента может завершиться успешно, но сервер вернет ошибку при вызове SQLExecute или SQLExecuteDirect. В частности, ODBC обрабатывает любое усечение дробных секунд как ошибку, в то время как поведение SQL Server округляется; Например, округление происходит при переходе с datetime2(6) на datetime2(2). Значения столбцов даты-времени округляются до 1/300 секунды, а в значениях типа smalldatetime сервер устанавливает для секунд значение, равное нулю.

SQL_TYPE_DATE SQL_TYPE_TIME SQL_SS_TIME2 SQL_TYPE_TIMESTAMP SQL_SS_TIMSTAMPOFFSET SQL_CHAR SQL_WCHAR
SQL_C_DATE 1 - - 1,6 1,5,6 1,13 1,13
SQL_C_TIME - 1 1 1,7 1,5,7 1,13 1,13
SQL_C_SS_TIME2 - 1,3 1,10 1,7 1,5,7 1,13 1,13
SQL_C_BINARY(SQL_SS_TIME2_STRUCT) Неприменимо Неприменимо 1,10,11 Неприменимо Н/Д Н/Д Неприменимо
SQL_C_TYPE_TIMESTAMP 1,2 1,3,4 1,4,10 1,10 1,5,10 1,13 1,13
SQL_C_SS_TIMESTAMPOFFSET 1,2,8 1,3,4,8 1,4,8,10 1,8,10 1,10 1,13 1,13
SQL_C_BINARY(SQL_SS_TIMESTAMPOFFSET_STRUCT) Неприменимо Н/Д Н/Д Неприменимо 1,10,11 Неприменимо Неприменимо
SQL_C_CHAR/SQL_WCHAR (дата) 9 9 9 9,6 9,5,6 Неприменимо Неприменимо
SQL_C_CHAR/SQL_WCHAR (time2) 9 9,3 9,10 9,7,10 9,5,7,10 Неприменимо Неприменимо
SQL_C_CHAR/SQL_WCHAR (datetime) 9,2 9,3,4 9,4,10 9,10 9,5,10 Неприменимо Неприменимо
SQL_C_CHAR/SQL_WCHAR (datetimeoffset) 9,2,8 9,3,4,8 9,4,8,10 9,8,10 9,10 Неприменимо Неприменимо
SQL_C_BINARY(SQL_DATE_STRUCT) 1,11 Неприменимо Н/Д Н/Д Н/Д Н/Д Неприменимо
SQL_C_BINARY(SQL_TIME_STRUCT) Неприменимо Н/Д Н/Д Н/Д Н/Д Н/Д Неприменимо
SQL_C_BINARY(SQL_TIMESTAMP_STRUCT) Неприменимо Н/Д Н/Д Н/Д Н/Д Н/Д Неприменимо

Расшифровка символов

  • -: преобразование не поддерживается. Создается запись диагностики с кодом SQLSTATE 07006 и сообщением «Нарушение атрибута ограниченного типа данных».

  • 1. Если предоставленные данные недопустимы, создается диагностическая запись с помощью SQLSTATE 22007 и сообщения "Недопустимый формат datetime".

  • 2. Поля времени должны быть нулевыми или диагностические записи создаются с помощью SQLSTATE 22008 и сообщения "Дробное усечение".

  • 3. Доля секунд должна быть нулевой или диагностическая запись создается с помощью SQLSTATE 22008 и сообщения "Дробное усечение".

  • 4. Компонент даты игнорируется.

  • 5. Часовой пояс задается параметром часового пояса клиента.

  • 6. Время равно нулю.

  • 7. Дата задана в качестве текущей даты.

  • 8. Время преобразуется из часового пояса клиента в формате UTC. Если во время этого преобразования возникла ошибка, создается запись диагностики с кодом SQLSTATE 22008 и сообщением «Переполнение поля datetime».

  • 9. Строка анализируется и преобразуется в значение даты, даты и времени, даты и времени в зависимости от первого символа препинания и наличия оставшихся компонентов. Затем строка преобразуется в целевой тип согласно правилам, описанным в приведенной выше таблице для типа исходных данных, который выясняется в процессе анализа. Если во время синтаксического анализа обнаружена ошибка, то создается диагностическая запись с кодом SQLSTATE 22018 и сообщением «Недопустимое значение символа для спецификации преобразования». Для параметров типа datetime и smalldatetime, если значение года выходит за пределы допустимого диапазона, создается диагностическая запись с кодом SQLSTATE 22007 и сообщением «Недопустимый формат даты и времени».

    Значение datetimeoffset после преобразования во времени в формате UTC должно находиться в пределах диапазона, даже если преобразование во времени в формате UTC не требуется. Причина этого заключается в том, что поток табличных данных и сервер всегда нормализуют время в значениях datetimeoffset для времени в формате UTC, поэтому клиент должен проверять, что значение времени после преобразования во времени в формате UTC находится в пределах поддерживаемого диапазона. Если переданы недопустимые для поддерживаемого диапазона времени в формате UTC данные, то создается диагностическая запись с кодом SQLSTATE 22007 и сообщением «Недопустимый формат даты и времени».

  • 10. Если происходит усечение с потерей данных, создается диагностическая запись с помощью SQLSTATE 22008 и сообщение "Недопустимый формат времени". Эта ошибка также возникает в том случае, если значение выходит за пределы диапазона, который может быть представлен диапазоном времени в формате UTC, используемым сервером.

  • 11. Если длина байтов данных не равна размеру структуры, требуемой типом SQL, создается диагностическая запись с помощью SQLSTATE 22003 и сообщение "Числовое значение вне диапазона".

  • 12. Если длина байтов данных равна 4 или 8, данные отправляются на сервер в необработанном формате TDS smalldatetime или datetime. Если байтовая длина данных в точности равна размеру структуры SQL_TIMESTAMP_STRUCT, данные преобразуются в формат потока табличных данных для типа datetime2.

  • 13. При усечении с потерей данных создается диагностическая запись с помощью SQLSTATE 22001 и сообщение "Строковые данные, усекается справа".

    Число цифр дробных секунд (шкала) определяется из размера целевого столбца в соответствии со следующей таблицей:

    Подразумеваемый масштаб Подразумеваемый масштаб
    Тип 0 1..9
    SQL_C_TYPE_TIMESTAMP 19 21..29

    Однако для типа SQL_C_TYPE_TIMESTAMP, если доли секунды можно представить в трех разрядах без потери данных, и размер столбца больше или равен 23, для дробной доли секунды создаются ровно три разряда. Это поведение обеспечивает обратную совместимость с приложениями, разработанными в расчете на более старые драйверы ODBC.

    Для размеров столбцов, превышающих диапазон таблицы, подразумевается масштаб 9. Это преобразование должно учитывать доли секунд с точностью до девяти значащих цифр — максимум, поддерживаемый ODBC.

    Если для столбца установлен размер, равный нулю, в ODBC это означает неограниченный размер для символьных типов переменной длины (9 разрядов там, где не работает правило трех разрядов для типа SQL_C_TYPE_TIMESTAMP). Задать размер столбца, равный нулю, для символьных типов фиксированной длины будет ошибкой.

  • N/A: существующее поведение SQL Server 2005 (9.x) и более раннее поведение сохраняется.

См. также

Улучшения функций даты и времени (ODBC)