绑定和转换 (OLE DB)

本部分讨论如何转换 datetimedatetimeoffset 值。 本部分所述的转换已由 OLE DB 提供,或者是 OLE DB 的一致扩展。

OLE DB 中日期和时间的文本和字符串的格式通常遵循 ISO,并且不依赖于客户端区域设置。 一个例外是DBTYPE_DATE,其中标准为 OLE 自动化。 但是,由于 SQL Server Native Client 仅在将数据传输到客户端或从客户端传输数据时在类型之间转换,因此应用程序无法强制 SQL Server Native Client 在DBTYPE_DATE和字符串格式之间进行转换。 否则,字符串使用以下格式(括号中的文本指示可选元素):

  • 字符串datetimeoffset的格式datetime为:

    yyyyy-毫米-dd[ hhmmss[.9999999][ ?? hhmm]]

  • 字符串的格式 time 为:

    hhmmss[.9999999]

  • 字符串的格式 date 为:

    yyyyy-毫米-dd

注释

早期版本的 SQL Server Native Client 和 SQLOLEDB 实现了 OLE 转换,以防标准转换失败。 因此,SQL Server Native Client 10.0 和更高版本的某些转换不同于 OLE DB 规范。

从字符串转换可以灵活地在空白和字段宽度。 有关详细信息,请参阅 数据类型支持 OLE DB 日期和时间改进中的“数据格式:字符串和文本”部分。

以下是常规转换规则:

  • 当字符串转换为日期/时间类型时,该字符串首先被分析为 ISO 文本。 如果此作失败,字符串将分析为具有时间组件的 OLE 日期文本。

  • 如果没有时间,但接收方可以存储时间,则时间设置为零。 如果没有日期,但接收方可以存储日期,则日期设置为使用 ISO 转换时的当前日期,使用 OLE 转换时设置为 1899-12-30。

  • 如果客户端使用的数据类型中不存在时区,但服务器可以存储时区,则假定客户端上的数据位于客户端时区中。

  • 如果服务器上没有时区,但客户端具有时区信息,则假定 UTC 时区。 这不同于服务器行为。

  • 如果时间存在,但接收方无法存储时间,则忽略时间组件。

  • 如果日期存在,但接收方无法存储日期,则忽略日期组件。

  • 如果从客户端转换为服务器时截断秒数或小数秒,则返回DB_E_ERRORSOCCURRED并设置状态DBSTATUS_E_DATAOVERFLOW。

  • 如果从服务器转换为客户端时截断秒数或小数秒,则设置DBSTATUS_S_TRUNCATED

本节中

从客户端到服务器执行的转换
描述使用 SQL Server Native Client OLE DB 和 SQL Server 2008(或更高版本)编写的客户端应用程序之间执行的日期/时间转换。

从服务器到客户端执行的转换
介绍在 SQL Server 2008(或更高版本)与使用 SQL Server Native Client OLE DB 编写的客户端应用程序之间执行的日期/时间转换。

另请参阅

日期和时间改进 (OLE DB)