Data, hora e literais de carimbo de data/hora
A sintaxe de escape para data, hora e literais de carimbo de data/hora é a seguinte:
{ -type ' value '}
onde literal-type é um dos valores listados na tabela a seguir.
literal-type | Significado | Formato do valor |
---|---|---|
d | Data | yyyy-mm-dd |
t | Hora* | hh:mm:ss [1] |
ts | Timestamp | aaaa-mm-dd hh:mm:ss[.f...][1] |
[1] O número de dígitos à direita do ponto decimal em um literal de intervalo de data/hora ou data/hora que contém um componente de segundos depende da precisão dos segundos, conforme contido no campo SQL_DESC_PRECISION descritor. (Para obter mais informações, consulte SQLSetDescField.)
Para obter mais informações sobre as sequências de escape de data, hora e carimbo de data/hora, consulte Sequências de escape de data, hora e carimbo de data/hora no Apêndice C: Gramática SQL.
Por exemplo, ambas as instruções SQL a seguir atualizam a data de abertura da ordem do cliente 1023 na tabela Pedidos. A primeira instrução usa a sintaxe de sequência de escape. A segunda instrução usa a sintaxe nativa do 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 em uma variável de caractere vinculada a um parâmetro de data, hora ou carimbo de data/hora. Por exemplo, o código a seguir usa um parâmetro de data vinculado a uma variável de caractere para atualizar a data de abertura da ordem de venda 1023 na tabela Pedidos:
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 vincular o parâmetro diretamente a uma estrutura de data:
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 oferece suporte às sequências de escape ODBC para literais de data, hora ou carimbo de data/hora, um aplicativo chama SQLGetTypeInfo. Se a fonte de dados oferecer suporte a um tipo de dados data, hora ou carimbo de data/hora, ela também deverá oferecer suporte à sequência de escape correspondente.
As fontes de dados também podem oferecer suporte aos literais datetime 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 oferece suporte aos literais ANSI, um aplicativo chama SQLGetInfo com a opção SQL_ANSI_SQL_DATETIME_LITERALS.
Para determinar se um driver oferece suporte a sequências de escape ODBC para literais de intervalo, um aplicativo chama SQLGetTypeInfo. Se a fonte de dados oferecer suporte a um tipo de dados de intervalo datetime, ela também deverá oferecer suporte à sequência de escape correspondente.
As fontes de dados também podem oferecer suporte aos literais datetime definidos na especificação ANSI SQL-92, que são diferentes das sequências de escape ODBC para literais de intervalo datetime. Para determinar se uma fonte de dados oferece suporte aos literais ANSI, um aplicativo chama SQLGetInfo com a opção SQL_ANSI_SQL_DATETIME_LITERALS.