Partilhar via


Literais de data, hora e marca temporal

A sequência de escape para data, hora e literais de timestamp é

{-type'value'}

onde o tipo literal é um dos valores listados na tabela seguinte.

tipo literal Meaning Formato de valor
d Date yyyy-mm-dd
t Hora* hh:mm:ss[1]
TS Data e Hora yyyy-mm-ddhh:mm:ss[.f...][1]

[1] O número de dígitos à direita do ponto decimal num literal de intervalo de tempo ou de carimbo temporal contendo um componente de segundos depende da precisão dos segundos, conforme contido no campo descritor SQL_DESC_PRECISION. (Para mais informações, veja SQLSetDescField.)

Para mais informações sobre as sequências de escape de data, hora e carimbo temporal, consulte Sequências de Escape de Data, Hora e Carimbo Temporal no Apêndice C: Gramática SQL.

Por exemplo, ambas as seguintes instruções SQL atualizam a data de abertura da ordem de venda 1023 na tabela de Encomendas. A primeira instrução utiliza a sintaxe da sequência de escape. A segunda instrução utiliza a sintaxe nativa Oracle Rdb para a coluna DATE e não é interoperável.

UPDATE Orders SET OpenDate={d '1995-01-15'} WHERE OrderID=1023  
UPDATE Orders SET OpenDate='15-Jan-1995' WHERE OrderID=1023  

A sequência de escape para um literal de data, hora ou carimbo de data/hora também pode ser colocada numa variável de carácter associada a um parâmetro de data, hora ou carimbo de data/hora. Por exemplo, o seguinte código utiliza um parâmetro de data atribuído a uma variável de carácter para atualizar a data de abertura da ordem de venda 1023 na tabela de Encomendas:

SQLCHAR      OpenDate[56]; // The size of a date literal is 55.  
SQLINTEGER   OpenDateLenOrInd = SQL_NTS;  
  
// Bind the parameter.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_TYPE_DATE, 0, 0,  
                  OpenDate, sizeof(OpenDate), &OpenDateLenOrInd);  
  
// Place the date in the OpenDate variable. In addition to the escape  
// sequence shown, it would also be possible to use either of the  
// strings "{d '1995-01-15'}" and "15-Jan-1995", although the latter  
// is data source-specific.  
strcpy_s( (char*) OpenDate, _countof(OpenDate), "{d '1995-01-15'}");  
  
// Execute the statement.  
SQLExecDirect(hstmt, "UPDATE Orders SET OpenDate=? WHERE OrderID = 1023", SQL_NTS);  

No entanto, é geralmente mais eficiente associar o parâmetro diretamente a uma estrutura de datas:

SQL_DATE_STRUCT   OpenDate;  
SQLINTEGER        OpenDateInd = 0;  
  
// Bind the parameter.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_TYPE_DATE, SQL_TYPE_DATE, 0, 0,  
                  &OpenDate, 0, &OpenDateLen);  
  
// Place the date in the dsOpenDate structure.  
OpenDate.year = 1995;  
OpenDate.month = 1;  
OpenDate.day = 15;  
  
// Execute the statement.  
SQLExecDirect(hstmt, "UPDATE Employee SET OpenDate=? WHERE OrderID = 1023", SQL_NTS);  

Para determinar se um driver suporta as sequências de escape ODBC para data, hora ou literais de timestamp, uma aplicação chama SQLGetTypeInfo. Se a fonte de dados suportar um tipo de data, hora ou carimbo temporal, deve também suportar a sequência de escape correspondente.

As fontes de dados também podem suportar os literais data-hora definidos na especificação ANSI SQL-92, que são diferentes das sequências de escape ODBC para literais de data, hora ou carimbo de data/hora. Para determinar se uma fonte de dados suporta os literais ANSI, uma aplicação chama SQLGetInfo com a opção SQL_ANSI_SQL_DATETIME_LITERALS.

Para determinar se um driver suporta as sequências de escape ODBC para literais de intervalo, uma aplicação chama SQLGetTypeInfo. Se a fonte de dados suportar um tipo de intervalo de data, deve também suportar a sequência de escape correspondente.

As fontes de dados também podem suportar os literais de data-hora definidos na especificação ANSI SQL-92, que são diferentes das sequências de escape ODBC para literais de intervalo de data-hora. Para determinar se uma fonte de dados suporta os literais ANSI, uma aplicação chama SQLGetInfo com a opção SQL_ANSI_SQL_DATETIME_LITERALS.