从 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;