本部分讨论如何转换 datetime 和 datetimeoffset 值。 本部分所述的转换已由 OLE DB 提供,或者是 OLE DB 的一致扩展。
OLE DB 中日期和时间的文本和字符串的格式通常遵循 ISO,并且不依赖于客户端区域设置。 一个例外是DBTYPE_DATE,其中标准为 OLE 自动化。 但是,由于 SQL Server Native Client 仅在将数据传输到客户端或从客户端传输数据时在类型之间转换,因此应用程序无法强制 SQL Server Native Client 在DBTYPE_DATE和字符串格式之间进行转换。 否则,字符串使用以下格式(括号中的文本指示可选元素):
字符串
datetimeoffset的格式datetime为:yyyyy-毫米-dd[ hh:mm:ss[.9999999][ ?? hh:mm]]
字符串的格式
time为:hh:mm:ss[.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 编写的客户端应用程序之间执行的日期/时间转换。