从客户端到服务器执行的转换

本主题介绍使用 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、smalldatetimedatetimedatetime2字符串,则字符串必须符合日期、时间或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 客户端结构中未嵌入时的值和类型的行为相同。

另请参阅

绑定和转换 (OLE DB)