SQL zu C: Tag-Uhrzeit-Intervalle
Die Bezeichner für die ODBC SQL-Datentypen für das Tag-Zeit-Intervall sind die folgenden:
- 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
In der folgenden Tabelle sind die ODBC C-Datentypen aufgeführt, in die SQL-Daten im Tages- und Uhrzeitintervall konvertiert werden können. Eine Erläuterung der Spalten und Begriffe in der Tabelle finden Sie unter Konvertieren von Daten aus SQL in C-Datentypen.
C-Typbezeichner | Test | *TargetValuePtr | *StrLen_or_IndPtr | SQLSTATE |
---|---|---|---|---|
Ganztägige C-Intervalltypen | Nachgestellter Feldteil nicht abgeschnitten Nachgestellter Feldteil abgeschnitten Führende Genauigkeit des Ziels ist nicht groß genug, um Daten aus der Quelle zu halten |
Daten Abgeschnittene Daten Nicht definiert |
Länge der Daten Länge der Daten Nicht definiert |
– 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] | Die Intervallgenauigkeit war ein einzelnes Feld, und die Daten wurden ohne Abschneiden konvertiert. Die Intervallgenauigkeit war ein einzelnes Feld und ein abgeschnittener Bruchteil. Intervallgenauigkeit war ein einzelnes Feld und abgeschnittenes Ganzes Intervallgenauigkeit war kein einzelnes Feld |
Daten Abgeschnittene Daten Abgeschnittene Daten Nicht definiert |
Größe des C-Datentyps Länge der Daten Länge der Daten Größe des C-Datentyps |
– 01S07 22003 07006 |
SQL_C_BINARY | Bytelänge der Daten <= BufferLength Bytelänge der Daten >BufferLength |
Daten Nicht definiert |
Länge der Daten Nicht definiert |
– 22003 |
SQL_C_CHAR | Zeichenbytelänge <BufferLength Anzahl der ganzen Ziffern (im Gegensatz zu Bruchstellen<) BufferLength Anzahl ganzer Ziffern (im Gegensatz zu Bruchstellen >) = BufferLength |
Daten Abgeschnittene Daten Nicht definiert |
Größe des C-Datentyps Größe des C-Datentyps Nicht definiert |
– 01004 22003 |
SQL_C_WCHAR | Zeichenlänge <BufferLength Anzahl der ganzen Ziffern (im Gegensatz zu Bruchstellen<) BufferLength Anzahl ganzer Ziffern (im Gegensatz zu Bruchstellen >) = BufferLength |
Daten Abgeschnittene Daten Nicht definiert |
Größe des C-Datentyps Größe des C-Datentyps Nicht definiert |
– 01004 22003 |
[a] Ein SQL-Typ für ein Tag-Zeit-Intervall kann in einen beliebigen Tag-Zeit-Intervall-C-Typ konvertiert werden.
[b] Wenn die Intervallgenauigkeit ein einzelnes Feld (TAG, STUNDE, MINUTE oder SEKUNDE) ist, kann der SQL-Intervalltyp in einen beliebigen genauen numerischen Typ (SQL_C_STINYINT, SQL_C_UTINYINT, SQL_C_USHORT, SQL_C_SHORT, SQL_C_SLONG, SQL_C_ULONG oder SQL_C_NUMERIC) konvertiert werden.
Die Standardkonvertierung eines SQL-Intervalltyps ist in den entsprechenden C-Intervalldatentyp. Die Anwendung bindet dann die Spalte oder den Parameter (oder legt das SQL_DESC_DATA_PTR Feld im entsprechenden Datensatz der ARD fest), um auf die initialisierte SQL_INTERVAL_STRUCT -Struktur zu verweisen (oder übergibt einen Zeiger auf die SQL_ INTERVAL_STRUCT-Struktur als TargetValuePtr-Argument in einem Aufruf von SQLGetData).
Im folgenden Beispiel wird veranschaulicht, wie Daten aus einer Spalte vom Typ SQL_INTERVAL_DAY_TO_MINUTE in die SQL_INTERVAL_STRUCT-Struktur übertragen werden, sodass sie als DAY_TO_HOUR Intervall zurückkommen.
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;