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
データ値は、フィールドを切り捨てずに変換されました

変換中にデータ値の 1 つ以上のフィールドが切り捨てられました
該当なし

22015

[a] すべての C 間隔データ型を文字データ型に変換できます。

[b] 間隔構造の型フィールドが 1 つのフィールド (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 データ型のサイズであると見なします。 長さ/インジケーター値は、SQLPutDataStrLen_or_Ind 引数と、SQLBindParameterStrLen_or_IndPtr 引数で指定されたバッファーに渡されます。 データ バッファーは、SQLPutDataDataPtr 引数と SQLBindParameterParameterValuePtr 引数で指定されます。

次の例では、SQL_INTERVAL_STRUCT構造に格納されている間隔 C データをデータベース列に送信する方法を示します。 interval 構造体には、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);