Преобразования типа данных 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) и более раннее поведение сохраняется.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по