针对 OLE DB 日期/时间改进的数据类型支持
本主题提供有关支持 SQL Server 日期/时间数据类型的 OLE DB (SQL Server Native Client) 类型的信息。
行集和参数中的数据类型映射
OLE DB 提供两种新数据类型来支持新服务器类型:DBTYPE_DBTIME2 和 DBTYPE_DBTIMESTAMPOFFSET。下表显示全部服务器类型映射:
SQL Server 数据类型 |
OLE DB 数据类型 |
值 |
---|---|---|
datetime |
DBTYPE_DBTIMESTAMP |
135 (oledb.h) |
smalldatetime |
DBTYPE_DBTIMESTAMP |
135 (oledb.h) |
date |
DBTYPE_DBDATE |
133 (oledb.h) |
time |
DBTYPE_DBTIME2 |
145 (sqlncli.h) |
datetimeoffset |
DBTYPE_DBTIMESTAMPOFFSET |
146 (sqlncli.h) |
datetime2 |
DBTYPE_DBTIMESTAMP |
135 (oledb.h) |
数据格式:字符串和文字
SQL Server 数据类型 |
OLE DB 数据类型 |
客户端转换的字符串格式 |
---|---|---|
datetime |
DBTYPE_DBTIMESTAMP |
'yyyy-mm-dd hh:mm:ss[.999]' SQL Server 对于 Datetime 最多支持三位数字的秒小数部分。 |
smalldatetime |
DBTYPE_DBTIMESTAMP |
'yyyy-mm-dd hh:mm:ss' 此数据类型精确到 1 分钟。秒部分在输出中将为零,在输入中由服务器进行四舍五入。 |
date |
DBTYPE_DBDATE |
'yyyy-mm-dd' |
time |
DBTYPE_DBTIME2 |
'hh:mm:ss[.9999999]' 可以选择指定最多达到七位数字的秒小数部分。 |
datetime2 |
DBTYPE_DBTIMESTAMP |
'yyyy-mm-dd hh:mm:ss[.fffffff]' 可以选择指定最多达到七位数字的秒小数部分。 |
datetimeoffset |
DBTYPE_DBTIMESTAMPOFFSET |
'yyyy-mm-dd hh:mm:ss[.fffffff] +/-hh:mm' 可以选择指定最多达到七位数字的秒小数部分。 |
SQL Server 2008 不会对日期/时间文字的转义序列进行任何更改。
结果中的秒小数部分使用点 (.) 而非冒号。
返回给应用程序的字符串值长度始终与给定列的长度相同。将使用前导零将年、月、日、小时、分钟和秒部分填充到最大长度。在日期和时间之间只有一个空格,时间和时区偏移量之间也只有一个空格。时区偏移量始终带符号。偏移量为零时,此符号将为正号 (+)。符号和偏移量值之间没有空格。必要时将使用尾随零将秒小数部分填充到列的定义精度,但是不会填充更多的零。对于 datetime 列,秒小数部分有三位数字。对于 smalldatetime 列,没有秒小数部分,秒始终为零。
从应用程序提供的字符串值转换将更为灵活,允许各个组成部分值小于最大长度。年可以包含 1-4 位数字。月、日、小时、分钟和秒可以包含 1 位或 2 位数字。日期/时间和时间/时区偏移量之间可以有任意多的空格。零小时零分钟的偏移量符号可以为正号,也可以为负号。可以为秒小数部分填充尾随零,使之最多达到 9 位数字。可以使用小数点结束时间部分,不带秒小数部分。
空字符串不是有效的日期/时间文字,它不表示 NULL 值。尝试将空字符串转换为日期/时间值将导致具有 SQLState 22018 和消息“为转换指定的字符值无效”的错误。
数据格式:数据结构
在以下所述的 OLE DB 特定结构中,OLE DB 遵守与 ODBC 相同的约束。这些值取自公历:
“月”范围为从 1 到 12。
“日”字段范围为 1 到所在月包含的天数,必须与“年”和“月”字段一致,考虑闰年。
“小时”范围为从 0 到 23。
“分钟”范围为从 0 到 59。
“秒”范围为从 0 到 59。最多允许两个闰秒以与恒星时同步。
已对以下现有 OLE DB 结构的实现进行了修改,以支持新的 SQL Server 日期和时间数据类型。不过未更改定义。
DBTYPE_DATE(这是自动化 DATE 类型。它在内部表示为 double。整数部分是自 1899 年 12 月 30 日以来的天数,而小数部分是不足一天的部分。此类型的精确度为 1 秒,因此具有有效的 0 刻度。)
DBTYPE_DBDATE
DBTYPE_DBTIME
DBTYPE_DBTIMESTAMP(小数字段由 OLE DB 定义为秒的十亿分之一(纳秒),范围为 0-999,999,999)
DBTYPE_FILETIME
DBTYPE_DBTIME2
它是 SQL Server 2008 中的新结构,在 32 位和 64 位操作系统中都填充到 12 个字节。
typedef struct tagDBTIME2 {
USHORT hour;
USHORT minute;
USHORT second;
ULONG fraction;
} DBTIME2;
DBTYPE_ DBTIMESTAMPOFFSET
它是 SQL Server 2008 中的新结构:
typedef struct tagDBTIMESTAMPOFFSET {
SHORT year;
USHORT month;
USHORT day;
USHORT hour;
USHORT minute;
USHORT second;
ULONG fraction;
SHORT timezone_hour;
SHORT timezone_minute;
} DBTIMESTAMPOFFSET;
如果 timezone_hour 为负数,timezone_minute 必须为负数或零。如果 timezone_hour 为正数,timezone minute 必须为正数或零。如果 timezone_hour 是零,timezone minute 可以取 -59 到 +59 之间的值。
SSVARIANT
已在 SQL Server 2008 中对此结构进行了修改以包括新结构 DBTYPE_DBTIME2 和 DBTYPE_ DBTIMESTAMPOFFSET,并为相应类型添加了秒小数部分。
struct SSVARIANT {
SSVARTYPE vt;
DWORD dwReserved1;
DWORD dwReserved2;
union {
// ...
DBTIMESTAMP tsDateTimeVal;
DBDATE dDateVal;
struct _Time2Val {
DBTIME2 tTime2Val;
BYTE bScale;
} Time2Val;
struct _DateTimeVal {
DBTIMESTAMP tsDateTimeVal;
BYTE bScale;
} DateTimeVal;
struct _DateTimeOffsetVal {
DBTIMESTAMPOFFSET tsoDateTimeOffsetVal;
BYTE bScale;
} DateTimeOffsetVal;
// ...
};
};
此外,将按以下方式对与 SSVARIANT 类型编码(该编码确定枚举的类型)关联的枚举进行了扩展:
enum SQLVARENUM {
// ...
// Datetime
VT_SS_DATETIME = DBTYPE_DBTIMESTAMP,
VT_SS_SMALLDATETIME = 206,
VT_SS_DATE = DBTYPE_DBDATE,
VT_SS_TIME2 = DBTYPE_DBTIME2,
VT_SS_DATETIME2 = 212
VT_SS_DATETIMEOFFSET = DBTYPE_DBTIMESTAMPOFFSET
};
如果将基础架构更新为使用 datetime2 而非 datetime,使用 sql_variant 并依赖于 datetime 的受限制精度的应用程序在迁移到 SQL Server 2008 时,必须对它们进行更新。
还通过添加以下内容,对 SSVARIANT 的访问宏进行了扩展:
#define V_SS_DATETIME2(X) V_SS_UNION(X, DateTimeVal)
#define V_SS_TIME2(X) V_SS_UNION(X, Time2Val)
#define V_SS_DATE(X) V_SS_UNION(X, dDateVal)
#define V_SS_DATETIMEOFFSET(X) V_SS_UNION(X, DateTimeOffsetVal)
ITableDefinition::CreateTable 中的数据类型映射
以下类型映射用于 ITableDefinition::CreateTable 所使用的 DBCOLUMNDESC 结构:
OLE DB 数据类型 (wType) |
SQL Server 数据类型 |
注释 |
---|---|---|
DBTYPE_DBDATE |
date |
|
DBTYPE_DBTIMESTAMP |
datetime2(p) |
SQL Server Native Client OLE DB 访问接口检查 DBCOLUMDESC bScale 成员以确定秒小数部分的精度。 |
DBTYPE_DBTIME2 |
time(p) |
SQL Server Native Client OLE DB 访问接口检查 DBCOLUMDESC bScale 成员以确定秒小数部分的精度。 |
DBTYPE_DBTIMESTAMPOFFSET |
datetimeoffset(p) |
SQL Server Native Client OLE DB 访问接口检查 DBCOLUMDESC bScale 成员以确定秒小数部分的精度。 |
应用程序以 wType 指定 DBTYPE_DBTIMESTAMP 时,它可以通过在 pwszTypeName 中提供类型名称来覆盖到 datetime2 的映射。如果指定 datetime,bScale 必须为 3。如果指定 smalldatetime,bScale 必须为 0。如果 bScale 与 wType 和 pwszTypeName 不一致,将返回DB_E_BADSCALE。