本主题介绍使用 SQL Server Native Client OLE DB 和 SQL Server 2008(或更高版本)编写的客户端应用程序之间执行的日期/时间转换。
转换
本主题介绍在客户端上进行的转换。 如果客户端为与服务器上定义的参数指定小数秒精度,则客户端转换可能会导致失败,以防服务器允许作成功。 具体而言,客户端将小数秒的任何截断视为错误,而 SQL Server 会将时间值舍入到最接近的整秒。
如果未调用 ICommandWithParameters::SetParameterInfo,则DBTYPE_DBTIMESTAMP绑定会像转换一 datetime2样转换。
| 自-> 来自 |
DBDATE (日期) | DBTIME (时间) | DBTIME2(时间) | DBTIMESTAMP (smalldatetime) | DBTIMESTAMP (datetime) | DBTIMESTAMP (datetime2) | DBTIMESTAMPOFFSET (datetimeoffset) | STR | WSTR | SQLVARIANT (sql_variant) |
|---|---|---|---|---|---|---|---|---|---|---|
| 日期 | 1,2 | 1,3,4 | 4,12 | 1,12 | 1,12 | 1,12 | 1,5, 12 | 1,12 | 1,12 | 1,12 datetime2(0) |
| DBDATE | 1 | - | - | 1,6 | 1,6 | 1,6 | 1,5, 6 | 1,10 | 1,10 | 1 日期 |
| DBTIME | - | 1 | 1 | 1,7 | 1,7 | 1,7 | 1,5, 7 | 1,10 | 1,10 | 1 时间(0) |
| DBTIME2 | - | 1,3 | 1 | 1,7,10,14 | 1,7,10,15 | 1,7,10 | 1,5,7,10 | 1,10,11 | 1,10,11 | 1 时间(7) |
| DBTIMESTAMP | 1,2 | 1,3,4 | 1,4,10 | 1,10,14 | 1,10,15 | 1,10 | 1,5,10 | 1,10,11 | 1,10,11 | 1,10 datetime2(7) |
| 数据库时间戳偏移 | 1,2,8 | 1,3,4,8 | 1,4,8,10 | 1,8,10,14 | 1,8,10,15 | 1,8,10 | 1,10 | 1,10,11 | 1,10,11 | 1,10 datetimeoffset(7) |
| FILETIME | 1,2 | 1,3,4 | 1,4,13 | 1,13 | 1,13 | 1,13 | 1,5,13 | 1,13 | 1,10 | 1,13 datetime2(3) |
| 字节 | - | - | - | - | - | - | - | 无 | 无 | 无 |
| 变体 | 1 | 1 | 1 | 1,10 | 1,10 | 1,10 | 1,10 | 无 | 无 | 1,10 |
| SSVARIANT | 1,16 | 1,16 | 1,16 | 1,10,16 | 1,10,16 | 1,10,16 | 1,10,16 | 无 | 无 | 1,16 |
| BSTR | 1,9 | 1,9 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 无 | 无 | 无 |
| STR | 1,9 | 1,9 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 无 | 无 | 无 |
| WSTR | 1,9 | 1,9 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 无 | 无 | 无 |
符号含义
| 符号 | 含义 |
|---|---|
| - | 不支持任何转换。 如果在调用 IAccessor::CreateAccessor 时验证绑定,则会在 rgStatus 中返回DBBINDSTATUS_UPSUPPORTEDCONVERSION。 延迟访问器验证后,将设置DBSTATUS_E_BADACCESSOR。 |
| 无 | 不適用。 |
| 1 | 如果提供的数据无效,则设置DBSTATUS_E_CANTCONVERTVALUE。 在应用转换之前验证输入数据,因此,即使后续转换将忽略组件,转换仍必须有效才能成功。 |
| 2 | 将忽略时间字段。 |
| 3 | 小数秒必须为零或设置DBSTATUS_E_DATAOVERFLOW。 |
| 4 | 忽略日期部分。 |
| 5 | 时区设置为客户端的时区设置。 |
| 6 | 时间设置为零。 |
| 7 | 日期设置为当前日期。 |
| 8 | 时间转换为 UTC。 如果在此转换期间发生错误,则设置DBSTATUS_E_CANTCONVERTVALUE。 |
| 9 | 字符串解析为 ISO 文本,并转换为目标类型。 如果此作失败,则会将字符串分析为 OLE 日期文本(它还包含时间组件),并将 OLE 日期(DBTYPE_DATE)转换为目标类型。 如果目标类型为 DBTIMESTAMP、 smalldatetime或datetimedatetime2字符串,则字符串必须符合日期、时间或datetime2文本的语法,或 OLE 识别的语法。 如果字符串是日期文本,则所有时间组件都设置为零。 如果字符串是时间文本,则日期设置为当前日期。对于所有其他目标类型,字符串必须符合目标类型的文本的语法。 |
| 10 | 如果发生数据丢失的小数秒截断,则设置DBSTATUS_E_DATAOVERFLOW。 对于字符串转换,仅当字符串符合 ISO 语法时,才能进行溢出检查。 如果字符串是 OLE 日期文本,则小数秒将舍入。 对于从 DBTIMESTAMP (datetime) 到 smalldatetime SQL Server Native Client 的转换,将以无提示方式截断秒值,而不是引发DBSTATUS_E_DATAOVERFLOW错误。 |
| 11 | 根据下表,从目标列的大小确定小数秒位数(小数位数)。 对于大于表中范围的列大小,则暗指小数位数为 9。 此转换应允许最高 9 位的秒的小数部分位数,这是 OLE DB 允许的最大位数。 但是,如果源类型为 DBTIMESTAMP 且小数秒为零,则不会生成小数秒位数或小数点。 此行为可确保使用较旧的 OLE DB 提供程序开发的应用程序向后兼容。 列大小约 0 表示 OLE DB(9 位数字,除非适用于 DBTIMESTAMP 的 3 位规则)中不限大小。 DBTIME2 - 8,10..18(字符长度):0,1..9 (缩放) DBTIMESTAMP - 19,21..29(字符长度):0,1..9 (缩放) DBTIMESTAMPOFFSET - 26,28..36(字符长度):0,1..9 (缩放) |
| 12 | 在 SQL Server 2008 之前的DBTYPE_DATE之前,将保留转换语义。 小数秒将被截断为零。 |
| 13 | SQL Server 2008 之前的转换语义将保留DBTYPE_FILETIME。 如果使用 Windows FileTimeToSystemTime API,则秒小数精度限制为 1 毫秒。 |
| 14 | 保留 SQL Server 2008 smalldatetime 之前的转换语义。 秒设置为零。 |
| 15 | 保留 SQL Server 2008 datetime 之前的转换语义。 秒舍入到第 300 秒最近的一秒。 |
| 16 | 在 SSVARIANT 客户端结构中嵌入的值(具有给定类型的)的转换行为与在 SSVARIANT 客户端结构中未嵌入时的值和类型的行为相同。 |