Compartilhar via


C para SQL: intervalos de tempo-dia

Os identificadores para os tipos de dados ODBC C de intervalo diurno são:

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

A tabela a seguir mostra os tipos de dados SQL ODBC para os quais os dados do intervalo C podem ser convertidos. Para obter uma explicação das colunas e dos termos na tabela, consulte Convertendo dados de C para tipos de dados SQL.

Identificador de tipo SQL Teste SQLSTATE
SQL_CHAR[a]

SQL_VARCHAR[a]

SQL_LONGVARCHAR[a]
Comprimento do byte >da coluna = Comprimento do byte do caractere

Comprimento do byte < da coluna Comprimento do byte do caractere[a]

O valor dos dados não é um literal de intervalo válido
n/d

22001

22015
SQL_WCHAR[a]

SQL_WVARCHAR[a]

SQL_WLONGVARCHAR[a]
Comprimento >do caractere da coluna = comprimento do caractere de dados

Comprimento do caractere de coluna < Comprimento do caractere de dados[a]

O valor dos dados não é um literal de intervalo válido
n/d

22001

22015
SQL_TINYINT[b]

SQL_SMALLINT[b] SQL_INTEGER[b]

SQL_BIGINT[b] SQL_NUMERIC[b]

SQL_DECIMAL[b]
A conversão de um intervalo de campo único não resultou em truncamento de dígitos inteiros

A conversão resultou em truncamento de dígitos inteiros
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
O valor dos dados foi convertido sem truncamento de nenhum campo

Um ou mais campos de valor de dados foram truncados durante a conversão
n/d

22015

[a] Todos os tipos de dados de intervalo C podem ser convertidos em um tipo de dados de caractere.

[b] Se o campo de tipo na estrutura de intervalo for tal que o intervalo for um único campo (SQL_DAY, SQL_HOUR, SQL_MINUTE ou SQL_SECOND), o tipo de intervalo C poderá ser convertido em qualquer campo numérico exato (SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER, SQL_BIGINT, SQL_DECIMAL ou SQL_NUMERIC).

A conversão padrão de um tipo C de intervalo é para o tipo SQL de intervalo de dia correspondente.

O driver ignora o valor de comprimento/indicador ao converter dados do tipo de dados do intervalo C e pressupõe que o tamanho do buffer de dados é o tamanho do tipo de dados C do intervalo. O valor de comprimento/indicador é passado no argumento StrLen_or_Ind em SQLPutData e no buffer especificado com o argumento StrLen_or_IndPtr em SQLBindParameter. O buffer de dados é especificado com o argumento DataPtr em SQLPutData e o argumento ParameterValuePtr em SQLBindParameter.

O exemplo a seguir demonstra como enviar dados de intervalo C armazenados na estrutura SQL_INTERVAL_STRUCT para uma coluna de banco de dados. A estrutura de intervalo contém um intervalo de DAY_TO_SECOND; ele será armazenado em uma coluna de banco de dados do 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);