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;