本主题介绍在 SQL Server 2008(或更高版本)与使用 SQL Server Native Client OLE DB 编写的客户端应用程序之间执行的日期/时间转换。
转换
下表介绍了返回到客户端的类型与绑定中的类型之间的转换。 对于输出参数,如果已调用 ICommandWithParameters::SetParameterInfo,并且 pwszDataSourceType 中指定的类型与服务器上的实际类型不匹配,则服务器将执行隐式转换,并且返回给客户端的类型将与通过 ICommandWithParameters::SetParameterInfo 指定的类型匹配。 当服务器的转换规则不同于本主题中所述的转换规则时,这可能会导致意外的转换结果。 例如,当必须提供默认日期时,SQL Server 使用 1900-1-1 而不是 1899-12-30。
| 自-> 来自 |
日期 | DBDATE | DBTIME | DBTIME2 | DBTIMESTAMP | 数据库时间戳偏移 | FILETIME | 字节 | 变体 | SSVARIANT | BSTR | STR | WSTR |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 日期 | 1,7 | 好的 | - | - | 1 | 1,3 | 1,7 | - | 确定(VT_BSTR) | 好的 | 好的 | 4 | 4 |
| 时间 | 5,6,7 | - | 9 | 好的 | 6 | 3,6 | 5,6 | - | 确定(VT_BSTR) | 好的 | 好的 | 4 | 4 |
| Smalldatetime | 7 | 8 | 9,10 | 10 | 好的 | 3 | 7 | - | 7 (VT_DATE) | 好的 | 好的 | 4 | 4 |
| 日期/时间 | 5,7 | 8 | 9,10 | 10 | 好的 | 3 | 7 | - | 7 (VT_DATE) | 好的 | 好的 | 4 | 4 |
| 日期时间2 | 5,7 | 8 | 9,10 | 10 | 7 | 3 | 5,7 | - | 确定(VT_BSTR) | 好的 | 好的 | 4 | 4 |
| Datetimeoffset | 5,7,11 | 8,11 | 9,10,11 | 10,11 | 7,11 | 好的 | 5,7,11 | - | 确定(VT_BSTR) | 好的 | 好的 | 4 | 4 |
| Char、Varchar、 Nchar、Nvarchar |
7, 13 | 12 | 12,9 | 12 | 12 | 12 | 7,13 | 无 | 无 | 无 | 无 | 无 | 无 |
| Sql_variant (日期时间) |
7 | 8 | 9,10 | 10 | 好的 | 3 | 7 | - | 7(VT_DATE) | 好的 | 好的 | 4 | 4 |
| Sql_variant (smalldatetime) |
7 | 8 | 9,10 | 10 | 好的 | 3 | 7 | - | 7(VT_DATE) | 好的 | 好的 | 4 | 4 |
| Sql_variant (日期) |
1,7 | 好的 | 2 | 2 | 1 | 1,3 | 1,7 | - | OK(VT_BSTR) | 好的 | 好的 | 4 | 4 |
| Sql_variant (时间) |
5,6,7 | 2 | 6 | 好的 | 6 | 3,6 | 5,6 | - | OK(VT_BSTR) | 好的 | 好的 | 4 | 4 |
| Sql_variant (datetime2) |
5,7 | 8 | 9,10 | 10 | 好的 | 3 | 5,7 | - | OK(VT_BSTR) | 好的 | 好的 | 4 | 4 |
| Sql_variant (datetimeoffset) |
5,7,11 | 8,11 | 9,10,11 | 10,11 | 7,11 | 好的 | 5,7,11 | - | OK(VT_BSTR) | 好的 | 好的 | 4 | 4 |
符号含义
| 符号 | 含义 |
|---|---|
| 好的 | 无需转换。 |
| - | 不支持任何转换。 如果在调用 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。 |