Da SQL a C: intervalli di tempo
Gli identificatori per i tipi di dati ODBC SQL dell'intervallo di giorno sono i seguenti:
- 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
Nella tabella seguente vengono illustrati i tipi di dati ODBC C in cui è possibile convertire i dati SQL dell'intervallo di tempo di giorno. Per una spiegazione delle colonne e dei termini nella tabella, vedere Conversione di dati da SQL a tipi di dati C.
Identificatore del tipo C | Test | *TargetValuePtr | *StrLen_or_IndPtr | SQLSTATE |
---|---|---|---|---|
Tutti i tipi di intervallo C dell'ora del giorno | Parte dei campi finali non troncata Parte dei campi finali troncata La precisione iniziale della destinazione non è abbastanza grande da contenere i dati dall'origine |
Dati Dati troncati Non definito |
Lunghezza dei dati Lunghezza dei dati Non definito |
N/D 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] | La precisione dell'intervallo è un singolo campo e i dati sono stati convertiti senza troncamento La precisione dell'intervallo era un singolo campo e troncato frazionaria La precisione dell'intervallo era un singolo campo e un intero troncato Precisione intervallo non è un singolo campo |
Dati Dati troncati Dati troncati Non definito |
Dimensioni del tipo di dati C Lunghezza dei dati Lunghezza dei dati Dimensioni del tipo di dati C |
N/D 01S07 22003 07006 |
SQL_C_BINARY | Lunghezza byte dei dati <= BufferLength Lunghezza byte dei dati >BufferLength |
Dati Non definito |
Lunghezza dei dati Non definito |
N/D 22003 |
SQL_C_CHAR | Lunghezza byte <carattere BufferLength Numero di cifre intere <(anziché frazionarie) BufferLength Numero di cifre intere >(anziché frazionarie) = BufferLength |
Dati Dati troncati Non definito |
Dimensioni del tipo di dati C Dimensioni del tipo di dati C Non definito |
N/D 01004 22003 |
SQL_C_WCHAR | BufferLength lunghezza <carattere Numero di cifre intere <(anziché frazionarie) BufferLength Numero di cifre intere >(anziché frazionarie) = BufferLength |
Dati Dati troncati Non definito |
Dimensioni del tipo di dati C Dimensioni del tipo di dati C Non definito |
N/D 01004 22003 |
[a] Un tipo SQL di intervallo di giorno può essere convertito in qualsiasi intervallo di tempo del giorno C.
[b] Se la precisione dell'intervallo è un singolo campo (uno dei campi DAY, HOUR, MINUTE o SECOND), il tipo SQL intervallo può essere convertito in qualsiasi tipo numerico esatto (SQL_C_STINYINT, SQL_C_UTINYINT, SQL_C_USHORT, SQL_C_SHORT, SQL_C_SLONG, SQL_C_ULONG o SQL_C_NUMERIC).
La conversione predefinita di un tipo SQL interval è nel tipo di dati intervallo C corrispondente. L'applicazione associa quindi la colonna o il parametro (o imposta il campo SQL_DESC_DATA_PTR nel record appropriato del ARD) in modo che punti alla struttura SQL_INTERVAL_STRUCT inizializzata (o passa un puntatore alla struttura SQL_ INTERVAL_STRUCT come argomento TargetValuePtr in una chiamata a SQLGetData).
Nell'esempio seguente viene illustrato come trasferire dati da una colonna di tipo SQL_INTERVAL_DAY_TO_MINUTE nella struttura SQL_INTERVAL_STRUCT in modo che venga restituita come intervallo di DAY_TO_HOUR.
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;