从 SQL 到 C:日期时间间隔
日时间间隔 ODBC SQL 数据类型的标识符如下:
- SQL_INTERVAL_DAY
- SQL_INTERVAL_DAY_TO_MINUTE
- SQL_INTERVAL_HOUR
- SQL_INTERVAL_DAY_TO_SECOND
- SQL_INTERVAL_MINUTE
- SQL_INTERVAL_HOUR_TO_MINUTE
- SQL_INTERVAL_SECOND
- SQL_INTERVAL_HOUR_TO_SECOND
- SQL_INTERVAL_DAY_TO_HOUR
- SQL_INTERVAL_MINUTE_TO_SECOND
下表显示了可将 SQL 数据转换为日时间间隔的 ODBC C 数据类型。 有关表中的列和术语的说明,请参阅 将数据从 SQL 转换为 C 数据类型。
C 类型标识符 | 测试 | *TargetValuePtr | *StrLen_or_IndPtr | SQLSTATE |
---|---|---|---|---|
所有日间 C 间隔类型 | 尾随字段部分未截断 尾随字段部分截断 目标前导精度不足以保存源中的数据 |
数据 截断的数据 Undefined |
数据长度 数据长度 Undefined |
不适用 01S07 22015 |
SQL_C_STINYINT[b] SQL_C_UTINYINT[b] SQL_C_USHORT[b] SQL_C_SHORT[b] SQL_C_SLONG[b] SQL_C_ULONG[b] SQL_C_NUMERIC[b] SQL_C_BIGINT[b] | 间隔精度为单个字段,转换数据时未截断 间隔精度为单个字段,截断了小数部分 间隔精度是单个字段,截断了整个 间隔精度不是单个字段 |
数据 截断的数据 截断的数据 Undefined |
C 数据类型的大小 数据长度 数据长度 C 数据类型的大小 |
不适用 01S07 22003 07006 |
SQL_C_BINARY | 数据的 <字节长度 = BufferLength 数据 >BufferLength 的字节长度 |
数据 Undefined |
数据长度 Undefined |
不适用 22003 |
SQL_C_CHAR | 字符字节长度 <BufferLength 整 (数,而不是小数) 位数 <BufferLength 与小数) 位数 >相比,整个 (数 = BufferLength |
数据 截断的数据 Undefined |
C 数据类型的大小 C 数据类型的大小 Undefined |
不适用 01004 22003 |
SQL_C_WCHAR | 字符长度 <BufferLength 整 (数,而不是小数) 位数 <BufferLength 与小数) 位数 >相比,整个 (数 = BufferLength |
数据 截断的数据 Undefined |
C 数据类型的大小 C 数据类型的大小 Undefined |
不适用 01004 22003 |
[a] 日时间间隔 SQL 类型可以转换为任何日时间间隔 C 类型。
[b] 如果间隔精度是 (DAY、HOUR、MINUTE 或 SECOND) 之一的单个字段,则可以将间隔 SQL 类型转换为任何精确的数值 (SQL_C_STINYINT、SQL_C_UTINYINT、SQL_C_USHORT、SQL_C_SHORT、SQL_C_SLONG、SQL_C_ULONG或SQL_C_NUMERIC) 。
间隔 SQL 类型的默认转换是到相应的 C 间隔数据类型。 然后,应用程序 (绑定列或参数,或设置 ARD) 适当记录中的SQL_DESC_DATA_PTR字段,以指向初始化的 SQL_INTERVAL_STRUCT 结构 (,或在调用 SQLGetData) 时将指向 SQL_ INTERVAL_STRUCT 结构的指针作为 TargetValuePtr 参数传递。
以下示例演示如何将数据从类型为 SQL_INTERVAL_DAY_TO_MINUTE 的列传输到 SQL_INTERVAL_STRUCT 结构,以便以DAY_TO_HOUR间隔返回。
SQL_INTERVAL_STRUCT is;
SQLINTEGER cbValue;
SQLUINTEGER days, hours;
// Execute a select statement; "interval_column" is a column
// whose data type is SQL_INTERVAL_DAY_TO_MINUTE.
SQLExecDirect(hstmt, "SELECT interval_column FROM table", SQL_NTS);
// Bind
SQLBindCol(hstmt, 1, SQL_C_INTERVAL_DAY_TO_MINUTE, &is, sizeof(SQL_INTERVAL_STRUCT), &cbValue);
// Fetch
SQLFetch(hstmt);
// Process data
days = is.intval.day_second.day;
hours = is.intval.day_second.hour;