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 データ型のサイズであると見なします。 長さ/インジケーター値は、SQLPutData の StrLen_or_Ind 引数と、SQLBindParameter の StrLen_or_IndPtr 引数で指定されたバッファーに渡されます。 データ バッファーは、SQLPutData の DataPtr 引数と SQLBindParameter の ParameterValuePtr 引数で指定されます。
次の例では、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);