Condividi tramite


Da C a SQL: intervalli di data/ora

Gli identificatori per i tipi di dati ODBC C intervallo di giorno sono:

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

Nella tabella seguente vengono illustrati i tipi di dati SQL ODBC in cui è possibile convertire i dati C dell'intervallo. Per una spiegazione delle colonne e dei termini nella tabella, vedere Conversione di dati da C a tipi di dati SQL.

Identificatore del tipo SQL Test SQLSTATE
SQL_CHAR[a]

SQL_VARCHAR[a]

SQL_LONGVARCHAR[a]
Lunghezza >byte colonna = Lunghezza byte carattere

Lunghezza byte di colonna < Lunghezza byte carattere[a]

Il valore dei dati non è un valore letterale intervallo valido
N/D

22001

22015
SQL_WCHAR[a]

SQL_WVARCHAR[a]

SQL_WLONGVARCHAR[a]
Lunghezza >carattere colonna = Lunghezza carattere dei dati

Lunghezza carattere colonna Lunghezza < carattere di dati[a]

Il valore dei dati non è un valore letterale intervallo valido
N/D

22001

22015
SQL_TINYINT[b]

SQL_SMALLINT[b] SQL_INTEGER[b]

SQL_BIGINT[b] SQL_NUMERIC[b]

SQL_DECIMAL[b]
La conversione di un intervallo a campo singolo non ha comportato il troncamento di intere cifre

La conversione ha comportato il troncamento di intere cifre
N/D

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
Il valore dei dati è stato convertito senza troncamento di alcun campo

Uno o più campi del valore di dati sono stati troncati durante la conversione
N/D

22015

[a] Tutti i tipi di dati intervallo C possono essere convertiti in un tipo di dati carattere.

[b] Se il campo di tipo nella struttura dell'intervallo è tale che l'intervallo sia un singolo campo (SQL_DAY, SQL_HOUR, SQL_MINUTE o SQL_SECOND), il tipo C intervallo può essere convertito in qualsiasi tipo numerico esatto (SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER, SQL_BIGINT, SQL_DECIMAL o SQL_NUMERIC).

La conversione predefinita di un tipo interval C è nel tipo SQL dell'intervallo di tempo di giorno corrispondente.

Il driver ignora il valore di lunghezza/indicatore durante la conversione dei dati dal tipo di dati interval C e presuppone che le dimensioni del buffer di dati siano le dimensioni del tipo di dati interval C. Il valore di lunghezza/indicatore viene passato nell'argomento StrLen_or_Ind in SQLPutData e nel buffer specificato con l'argomento StrLen_or_IndPtr in SQLBindParameter. Il buffer di dati viene specificato con l'argomento DataPtr in SQLPutData e l'argomento ParameterValuePtr in SQLBindParameter.

Nell'esempio seguente viene illustrato come inviare dati di intervallo C archiviati nella struttura SQL_INTERVAL_STRUCT in una colonna di database. La struttura dell'intervallo contiene un intervallo DAY_TO_SECOND; verrà archiviato in una colonna di database di tipo SQL_INTERVAL_DAY_TO_MINUTE.

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