由 SQL 到 C 的 datetime 数据类型转换

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

下表列出了从SQL Server日期/时间类型转换为 C 类型时要考虑的问题。

转换

SQL_C_DATE SQL_C_TIME SQL_C_TIMESTAMP SQL_C_SS_TIME2 SQL_C_SS_TIMESTAMPOFFSET SQL_C_BINARY SQL_C_CHAR SQL_C_WCHAR
SQL_CHAR 2,3,4,5 2,3,6,7,8 2,3,9,10,11 2,3,6,7 2,3,9,10,11 1 1 1
SQL_WCHAR 2,3,4,5 2,3,6,7,8 2,3,9,10,11 2,3,6,7 2,3,9,10,11 1 1 1
SQL_TYPE_DATE 确定 12 13 12 13,23 14 16 16
SQL_SS_TIME2 12 8 15 确定 10,23 17 16 16
SQL_TYPE_TIMESTAMP 18 7,8 确定 7 23 19 16 16
SQL_SS_TIMESTAMPOFFSET 18,22 7,8,20 20 7,20 确定 21 16 16

符号含义

符号 含义
OK 无转换问题。
1 SQL Server 2008 (10.0.x) 之前的规则适用。
2 忽略前导空格和尾随空格。
3 字符串解析为日期、时间、时区或时区偏移量,且秒的小数部分允许多达 9 位。 如果解析时区偏移量,则时间将转换为客户端时区。 如果在此转换期间发生错误,则会使用 SQLSTATE 22018 和消息“Datetime 字段溢出”生成诊断记录。
4 如果该值不是有效的日期、时间戳或时间戳偏移量值,则生成具有 SQLSTATE 22018 和消息“为转换指定的字符值无效”的诊断记录。
5 如果时间为非零,则生成具有 SQLSTATE 01S07 和消息“截断小数部分”的诊断记录。
6 如果该值不是有效的时间、时间戳或时间戳偏移量值,则生成具有 SQLSTATE 22018 和消息“为转换指定的字符值无效”的诊断记录。
7 忽略日期部分。
8 如果秒的小数部分为非零,则生成具有 SQLSTATE 01S07 和消息“截断小数部分”的诊断记录。
9 如果值不是有效的日期、时间、时间戳或 timestampoffset 值,则会使用 SQLSTATE 22018 和消息“强制转换规范的字符值无效”生成诊断记录。
10 如果该值是有效的时间,则日期部分设置为当前客户端的日期。
11 如果该值是有效的日期,则时间设置为零。
12 生成具有 SQLSTATE 07006 和消息“受限制的数据类型属性冲突”的诊断记录。
13 时间设置为零。
14 如果缓冲区不足以容纳 SQL_DATE_STRUCT,则生成具有 SQLSTATE 22003 和消息“数值超出了范围”的诊断记录。
15 日期设置为当前客户端的日期。
16 如果缓冲区不足以容纳转换后的字符串值,只能容纳秒的小数部分,则会发生截断,且生成具有 SQLSTATE 01004 和消息“字符串数据,右端被截断”的诊断记录。 如果缓冲区不足以容纳未截断日期、时间或偏移量部分的字符串值,则生成具有 SQLSTATE 22003 和消息“数值超出了范围”的诊断记录。 请注意,对于日期和时间戳偏移量,由于转换后的字符串最右侧部分不包含秒的小数部分,因此不可能为 SQLSTATE 01004。 因此,任何截断都会造成数据丢失。
17 如果缓冲区不足以容纳 SQL_SS_TIME2_STRUCT,则生成具有 SQLSTATE 22003 和消息“数值超出了范围”的诊断记录。
18 如果时间为非零,则生成具有 SQLSTATE 01S07 和消息“截断小数部分”的诊断记录。
19 如果服务器类型为 datetime 或 smalldatetime,则值对应于 TDS 连网格式,对于 smalldatetime 为 4 字节值,对于 datetime 为 8 字节值。

如果服务器类型为 datetime2,则按照 SQL_TIMESTAMP_STRUCT 返回值。 如果缓冲区不足以容纳返回值,则生成具有 SQLSTATE 22003 和消息“数值超出了范围”的诊断记录。
20 将时间转换为客户端时区。 如果在此转换过程中发生错误,则生成具有 SQLSTATE 22008 和消息“日期时间字段溢出”的诊断记录。
21 如果缓冲区足以容纳 SQL_SS_TIMESTAMPOFFSET_STRUCT,则按照 SQL_SS_TIMESTAMPOFFSET_STRUCT 返回值。 否则,生成具有 SQLSTATE 22003 和消息“数值超出了范围”的诊断记录。
22 在提取日期之前,将值转换为客户端时区。 这提供了与其他时间戳偏移量类型转换的一致性。 如果在此转换过程中发生错误,则生成具有 SQLSTATE 22008 和消息“日期时间字段溢出”的诊断记录。 这可能会导致日期与通过简单截断获得的值不同。

本主题中的表格列出了返回客户端的类型与绑定中的类型之间的转换。 对于输出参数,如果 SQLBindParameter 中指定的服务器类型与服务器上的实际类型不匹配,则服务器将执行隐式转换,并且返回给客户端的类型将与通过 SQLBindParameter 指定的类型匹配。 当服务器的转换规则与上表中列出的规则不同时,这可能会导致意外的转换结果。 例如,当必须提供默认日期时,SQL Server使用 1900-1-1,而不是当前日期。

另请参阅

日期和时间改进 (ODBC)