分享方式:


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 間隔類型 結尾欄位部分未截斷

結尾欄位部分截斷

目標的主要精確度不夠大,無法保存來源的資料
資料

截斷的資料

未定義
資料長度

資料長度

未定義
n/a

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] 間隔有效位數是單一欄位,且資料未經截斷即可轉換

間隔有效位數是單一欄位和截斷的小數點數

間隔有效位數是單一欄位並截斷整個

間隔有效位數不是單一欄位
資料

截斷的資料

截斷的資料

未定義
C 資料類型的大小

資料長度

資料長度

C 資料類型的大小
n/a

01S07

22003

07006
SQL_C_BINARY 位元組長度的資料 < = BufferLength

資料 > BufferLength 的位元組長度
資料

未定義
資料長度

未定義
n/a

22003
SQL_C_CHAR 字元位元組長度 < BufferLength

整數數(而不是小數)位數 < BufferLength

整數數 (而不是小數) 位數 > = BufferLength
資料

截斷的資料

未定義
C 資料類型的大小

C 資料類型的大小

未定義
n/a

01004

22003
SQL_C_WCHAR 字元長度 < BufferLength

整數數(而不是小數)位數 < BufferLength

整數數 (而不是小數) 位數 > = BufferLength
資料

截斷的資料

未定義
C 資料類型的大小

C 資料類型的大小

未定義
n/a

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 interval 資料類型。 然後,應用程式會系結資料行或參數(或設定 ARD 適當記錄中的SQL_DESC_DATA_PTR欄位),以指向初始化的SQL_INTERVAL_STRUCT結構(或將指標傳遞至SQL_ INTERVAL_STRUCT結構的指標,做為 對 SQLGetData 的呼叫 中的 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;