Fecha, hora y marca de tiempo literales
La secuencia de escape para los literales de fecha, hora y marca de tiempo es
{ -type ' value '}
donde literal-type es uno de los valores listados en la siguiente tabla.
literal-type | Significado | Formato de valor |
---|---|---|
d | Date | aaaa-mm-dd |
t | Hora* | hh:mm:ss[1] |
ts | Marca de tiempo | yyyy-mm-dd hh:mm:ss[.f...][1] |
[1] El número de dígitos a la derecha del punto decimal en un literal de intervalo de tiempo o marca de tiempo que contenga un componente de segundos depende de la precisión de los segundos, tal y como se indica en el campo descriptor SQL_DESC_PRECISION. (Para obtener más información, consulte SQLSetDescField.)
Para obtener más información sobre las secuencias de escape de fecha, hora y marca de tiempo, consulte Secuencias de escape de fecha, hora y marca de tiempo en el Apéndice C: Gramática SQL.
Por ejemplo, las dos instrucciones SQL siguientes actualizan la fecha de apertura del pedido de ventas 1023 en la tabla Pedidos. La primera instrucción usa la sintaxis de secuencia de escape. La segunda instrucción usa la sintaxis nativa de Oracle Rdb para la columna DATE y no es interoperable.
UPDATE Orders SET OpenDate={d '1995-01-15'} WHERE OrderID=1023
UPDATE Orders SET OpenDate='15-Jan-1995' WHERE OrderID=1023
La secuencia de escape para un literal de fecha, hora o marca de tiempo también puede colocarse en una variable de caracteres ligada a un parámetro de fecha, hora o marca de tiempo. Por ejemplo, el siguiente código usa un parámetro de fecha vinculado a una variable de caracteres para actualizar la fecha de apertura del pedido de ventas 1023 en la tabla 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);
Sin embargo, por lo general es más eficaz vincular el parámetro directamente a una estructura de fecha:
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 si un controlador admite las secuencias de escape ODBC para los literales de fecha, hora o marca de tiempo, una aplicación llama a SQLGetTypeInfo. Si el origen de datos admite un tipo de datos de fecha, hora o marca de tiempo, también debe admitir la secuencia de escape correspondiente.
Los orígenes de datos también admiten los literales datetime definidos en la especificación ANSI SQL-92, que son diferentes de las secuencias de escape ODBC para los literales fecha, hora o marca de tiempo. Para determinar si un origen de datos admite los literales ANSI, una aplicación llama a SQLGetInfo con la opción SQL_ANSI_SQL_DATETIME_LITERALS.
Para determinar si un controlador admite las secuencias de escape ODBC para los literales de intervalo, una aplicación llama a SQLGetTypeInfo. Si el origen de datos admite un tipo de datos de intervalo datetime, también debe admitir la secuencia de escape correspondiente.
Los orígenes de datos también admiten los literales datetime definidos en la especificación ANSI SQL-92, que son diferentes de las secuencias de escape ODBC para los literales de intervalo datetime. Para determinar si un origen de datos admite los literales ANSI, una aplicación llama a SQLGetInfo con la opción SQL_ANSI_SQL_DATETIME_LITERALS.