在服务器和客户端之间执行的转换

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

下载 OLE DB 驱动程序

本文介绍在 SQL Server 2008 (10.0.x) 及更高版本与使用 OLE DB Driver for SQL Server 编写的客户端应用程序之间执行的日期/时间转换。

转换

下表说明了返回到客户端的类型与绑定中的类型之间的转换。 对于输出参数,如果已调用 ICommandWithParameters::SetParameterInfo,并且在 pwszDataSourceType 中指定的类型与服务器上的实际类型不匹配,该服务器将执行隐式转换,并且返回到客户端的类型将与通过 ICommandWithParameters::SetParameterInfo 指定的类型匹配。 如果服务器的转换规则与本文描述的不同,这可能会导致意外转换结果出现。 例如,在必须提供默认日期时,SQL Server 使用 1900-1-1,而不是 1899-12-30。

转换 ->

DATE DBDATE DBTIME DBTIME2 DBTIMESTAMP DBTIMESTAMPOFFSET FILETIME BYTES VARIANT SSVARIANT BSTR STR WSTR
Date 1, 7 OK - - 1 1, 3 1, 7 - OK (VT_BSTR) OK OK 4 4
时间 5, 6, 7 - 9 OK 6 3, 6 5, 6 - OK (VT_BSTR) OK OK 4 4
Smalldatetime 7 8 9, 10 10 OK 3 7 - 7 (VT_DATE) OK OK 4 4
Datetime 5, 7 8 9, 10 10 OK 3 7 - 7 (VT_DATE) OK OK 4 4
Datetime2 5, 7 8 9, 10 10 7 3 5, 7 - OK (VT_BSTR) OK OK 4 4
Datetimeoffset 5, 7, 11 8, 11 9, 10, 11 10, 11 7, 11 OK 5, 7, 11 - OK (VT_BSTR) OK OK 4 4
Char、Varchar、

Nchar、Nvarchar
7, 13 12 12, 9 12 12 12 7, 13 空值 不可用 不可用 不可用 不可用 空值
Sql_variant

(datetime)
7 8 9, 10 10 OK 3 7 - 7(VT_DATE) OK OK 4 4
Sql_variant

(smalldatetime)
7 8 9, 10 10 OK 3 7 - 7(VT_DATE) OK OK 4 4
Sql_variant

(date)
1, 7 OK 2 2 1 1, 3 1, 7 - OK(VT_BSTR) OK OK 4 4
Sql_variant

(time)
5, 6, 7 2 6 OK 6 3, 6 5, 6 - OK(VT_BSTR) OK OK 4 4
Sql_variant

(datetime2)
5, 7 8 9, 10 10 OK 3 5, 7 - OK(VT_BSTR) OK OK 4 4
Sql_variant

(datetimeoffset)
5, 7, 11 8, 11 9, 10, 11 10, 11 7, 11 OK 5, 7, 11 - OK(VT_BSTR) OK OK 4 4

符号含义

符号 含义
OK 不需要任何转换。
- 不支持任何转换。 如果在调用 IAccessor::CreateAccessor 时验证绑定,则在 rgStatus 中返回 DBBINDSTATUS_UPSUPPORTEDCONVERSION。 当延迟取值函数验证时,则设置 DBSTATUS_E_BADACCESSOR。
1 时间字段设置为零。
2 设置 DBSTATUS_E_CANTCONVERTVALUE。
3 时区设置为零。
4 如果客户端缓冲区不够大,则设置 DBSTATUS_S_TRUNCATED。 如果服务器类型包含秒的小数部分,结果字符串中的位数与服务器类型的小数位数完全匹配。
5 截断的秒或秒的小数部分将被忽略。
6 除非源为字符串时间文字,并且目标为 DBTYPE_DATE,否则将日期设置为当前日期。 这种情况下,将使用 1899-12-30。
7 如果值溢出,则设置 DBSTATUS_E_DATAOVERFLOW。
8 忽略时间字段。
9 忽略秒的小数部分字段。
10 忽略日期部分。
11 将时间转换为客户端时区。 如果在此转换过程中出现错误,则设置 DBSTATUS_E_DATAOVERFLOW。
12 字符串分析为 ISO 文字并转换为目标类型。 如果上述操作失败,该字符串则分析为 OLE 日期文字(还包含时间部分),并从 OLE 日期 (DBTYPE_DATE) 转换为目标类型。 字符串必须符合成功分析 ISO 格式所允许的目标类型的文字语法。 若要成功分析 OLE,字符串必须符合可由 OLE 识别的语法。 如果无法分析该字符串,则设置 DBSTATUS_E_CANTCONVERTVALUE。 如果任一部分的值超出范围,则设置 DBSTATUS_E_DATAOVERFLOW。
13 字符串分析为 ISO 文字并转换为目标类型。 如果上述操作失败,该字符串则分析为 OLE 日期文字(还包含时间部分),并从 OLE 日期 (DBTYPE_DATE) 转换为目标类型。 除非目标为 DBTYPE_DATE 或 DBTYPE_DBTIMESTAMP,否则该字符串必须符合日期时间文字的语法。 在这种情况下,允许日期时间或时间文字,以便成功分析 ISO 格式。 若要成功分析 OLE,字符串必须符合可由 OLE 识别的语法。 如果无法分析该字符串,则设置 DBSTATUS_E_CANTCONVERTVALUE。 如果任一部分的值超出范围,则设置 DBSTATUS_E_DATAOVERFLOW。

另请参阅

绑定和转换 (OLE DB)