从 C 到 SQL:日期时间间隔

日时间间隔 ODBC C 数据类型的标识符为:

SQL_C_INTERVAL_DAY

SQL_C_INTERVAL_HOUR

SQL_C_INTERVAL_MINUTE

SQL_C_INTERVAL_SECOND

SQL_C_INTERVAL_DAY_TO_HOUR

SQL_C_INTERVAL_DAY_TO_MINUTE

SQL_C_INTERVAL_DAY_TO_SECOND

SQL_C_INTERVAL_HOUR_TO_MINUTE

SQL_C_INTERVAL_HOUR_TO_SECOND

SQL_C_INTERVAL_MINUTE_TO_SECOND

下表显示了可将间隔 C 数据转换为的 ODBC SQL 数据类型。 有关表中列和术语的说明,请参阅 将数据从 C 转换为 SQL 数据类型

SQL 类型标识符 测试 SQLSTATE
SQL_CHAR[a]

SQL_VARCHAR[a]

SQL_LONGVARCHAR[a]
列字节长度 >= 字符字节长度

列字节长度 < 字符字节长度[a]

数据值不是有效的间隔文本
不适用

22001

22015
SQL_WCHAR[a]

SQL_WVARCHAR[a]

SQL_WLONGVARCHAR[a]
列字符长度 >= 数据的字符长度

列字符长度 < 数据的字符长度[a]

数据值不是有效的间隔文本
不适用

22001

22015
SQL_TINYINT[b]

SQL_SMALLINT[b] SQL_INTEGER[b]

SQL_BIGINT[b] SQL_NUMERIC[b]

SQL_DECIMAL[b]
单字段间隔的转换不会导致截断整个数字

转换导致截断整个数字
不适用

22003
SQL_INTERVAL_DAY

SQL_INTERVAL_HOUR

SQL_INTERVAL_MINUTE

SQL_INTERVAL_SECOND

SQL_INTERVAL_DAY_TO_HOUR

SQL_INTERVAL_DAY_TO_MINUTE

SQL_INTERVAL_DAY_TO_SECOND

SQL_INTERVAL_HOUR_TO_MINUTE

SQL_INTERVAL_HOUR_TO_SECOND

SQL_INTERVAL_MINUTE_TO_SECOND
转换数据值时未截断任何字段

转换期间截断了一个或多个数据值的字段
不适用

22015

[a] 所有 C 间隔数据类型都可以转换为字符数据类型。

[b] 如果间隔结构中的类型字段是单个字段 (SQL_DAY、SQL_HOUR、SQL_MINUTE或SQL_SECOND) ,则可以将间隔 C 类型转换为任何确切的数值 (SQL_TINYINT、SQL_SMALLINT、SQL_INTEGER、SQL_BIGINT、SQL_DECIMAL或SQL_NUMERIC) 。

间隔 C 类型的默认转换为相应的日时间间隔 SQL 类型。

驱动程序在从间隔 C 数据类型转换数据时忽略长度/指示器值,并假定数据缓冲区的大小是间隔 C 数据类型的大小。 长度/指示器值在 SQLPutData 中的 StrLen_or_Ind 参数中传递,并使用 SQLBindParameter 中的 StrLen_or_IndPtr 参数指定的缓冲区中传递。 数据缓冲区是使用 SQLPutData 中的 DataPtr 参数和 SQLBindParameter 中的 ParameterValuePtr 参数指定的。

以下示例演示如何将存储在 SQL_INTERVAL_STRUCT 结构中的间隔 C 数据发送到数据库列。 间隔结构包含DAY_TO_SECOND间隔;它将存储在 SQL_INTERVAL_DAY_TO_MINUTE 类型的数据库列中。

SQL_INTERVAL_STRUCT is;  
SQLINTEGER cbValue;  
  
// Initialize the interval struct to contain the DAY_TO_SECOND  
// interval "154 days, 22 hours, 44 minutes, and 10 seconds"  
is.intval.day_second.day      = 154;  
is.intval.day_second.hour     = 22;  
is.intval.day_second.minute   = 44;  
is.intval.day_second.second   = 10;  
is.interval_sign              = SQL_FALSE;  
  
// Bind the dynamic parameter  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_INTERVAL_DAY_TO_SECOND,  
                  SQL_INTERVAL_DAY_TO_MINUTE, 0, 0, &is,  
                  sizeof(SQL_INTERVAL_STRUCT), &cbValue);  
  
// Execute an insert statement; "interval_column" is a column  
// whose data type is SQL_INTERVAL_DAY_TO_MINUTE.  
SQLExecDirect(hstmt,"INSERT INTO table(interval_column) VALUES (?)",SQL_NTS);