Teilen über


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);