C zu SQL: Tag-Uhrzeit-Intervalle
Die Bezeichner für die ODBC C-Datentypen des Tag-Zeitintervalls sind:
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
Die folgende Tabelle zeigt die ODBC SQL-Datentypen, in die C-Intervalldaten konvertiert werden können. Eine Erläuterung der Spalten und Begriffe in der Tabelle finden Sie unter Konvertieren von Daten aus C in SQL-Datentypen.
SQL-Typbezeichner | Test | SQLSTATE |
---|---|---|
SQL_CHAR[a] SQL_VARCHAR[a] SQL_LONGVARCHAR[a] |
Spaltenbytelänge >= Zeichenbytelänge Spaltenbytelänge < Zeichenbytelänge[a] Der Datenwert ist kein gültiges Intervallliteral. |
– 22001 22015 |
SQL_WCHAR[a] SQL_WVARCHAR[a] SQL_WLONGVARCHAR[a] |
Spaltenzeichenlänge >= Zeichenlänge der Daten Spaltenzeichenlänge < Zeichenlänge von data[a] Der Datenwert ist kein gültiges Intervallliteral. |
– 22001 22015 |
SQL_TINYINT[b] SQL_SMALLINT[b] SQL_INTEGER[b] SQL_BIGINT[b] SQL_NUMERIC[b] SQL_DECIMAL[b] |
Die Konvertierung eines einfeldigen Intervalls hat keine Kürzung ganzer Ziffern zur Folge. Konvertierung führte zum Abschneiden ganzer Ziffern |
– 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 |
Der Datenwert wurde ohne Abschneiden von Feldern konvertiert. Mindestens ein Feld des Datenwerts wurde während der Konvertierung abgeschnitten. |
– 22015 |
[a] Alle C-Intervalldatentypen können in einen Zeichendatentyp konvertiert werden.
[b] Wenn das Typfeld in der Intervallstruktur so ist, dass das Intervall ein einzelnes Feld (SQL_DAY, SQL_HOUR, SQL_MINUTE oder SQL_SECOND) ist, kann der Intervall-C-Typ in einen beliebigen exakten numerischen Typ (SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER, SQL_BIGINT, SQL_DECIMAL oder SQL_NUMERIC) konvertiert werden.
Die Standardkonvertierung eines Intervall-C-Typs ist in den entsprechenden SQL-Typ für das Tages-Zeit-Intervall.
Der Treiber ignoriert den Längen-/Indikatorwert beim Konvertieren von Daten aus dem Intervall-C-Datentyp und geht davon aus, dass die Größe des Datenpuffers der Größe des Intervall-C-Datentyps entspricht. Der Längen-/Indikatorwert wird im argument StrLen_or_Ind in SQLPutData und im Puffer übergeben, der mit dem argument StrLen_or_IndPtr in SQLBindParameter angegeben ist. Der Datenpuffer wird mit dem Argument DataPtr in SQLPutData und dem Argument ParameterValuePtr in SQLBindParameter angegeben.
Im folgenden Beispiel wird veranschaulicht, wie in der SQL_INTERVAL_STRUCT-Struktur gespeicherte C-Intervalldaten an eine Datenbankspalte gesendet werden. Die Intervallstruktur enthält ein DAY_TO_SECOND Intervall. Sie wird in einer Datenbankspalte vom Typ SQL_INTERVAL_DAY_TO_MINUTE gespeichert.
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);