Литералы даты, времени и отметок времени
Escape-последовательность для литерала даты, времени и метки времени
{ -type ' value '}
где литерал является одним из значений, перечисленных в следующей таблице.
литеральный тип | Значение | Формат значения |
---|---|---|
дн. | Дата | гггг-мм-дд |
с | Время* | hh:mm:ss[1] |
ts | Метка времени | гггг мм--дд чч:мм:ss[.f...][1] |
[1] Число цифр справа от десятичной запятой в литерал интервала времени или метки времени, содержащего компонент секунд, зависит от точности секунд, как указано в поле дескриптора SQL_DESC_PRECISION. (Дополнительные сведения см. в разделе SQLSetDescField.)
Дополнительные сведения о последовательностях escape-меток даты, времени и метки времени см. в разделе "Даты,время" и "Метка времени" в приложении C: грамматика SQL.
Например, оба из следующих инструкций SQL обновляют открытую дату заказа на продажу 1023 в таблице "Заказы". Первая инструкция использует синтаксис escape-последовательности. Вторая инструкция использует собственный синтаксис Oracle Rdb для столбца DATE и не совместим.
UPDATE Orders SET OpenDate={d '1995-01-15'} WHERE OrderID=1023
UPDATE Orders SET OpenDate='15-Jan-1995' WHERE OrderID=1023
Escape-последовательность для литерала даты, времени или метки времени также может быть помещена в символьную переменную, привязанную к параметру даты, времени или метки времени. Например, следующий код использует параметр даты, привязанный к символьной переменной, для обновления открытой даты заказа на продажу 1023 в таблице Orders:
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);
Тем не менее, обычно это более эффективно для привязки параметра непосредственно к структуре дат:
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);
Чтобы определить, поддерживает ли драйвер escape-последовательности ODBC для литералов даты, времени или метки времени, приложение вызывает SQLGetTypeInfo. Если источник данных поддерживает тип данных даты, времени или метки времени, он также должен поддерживать соответствующую escape-последовательность.
Источники данных также могут поддерживать литералы даты и времени, определенные в спецификации ANSI SQL-92, которые отличаются от escape-последовательностей ODBC для литералов даты, времени или метки времени. Чтобы определить, поддерживает ли источник данных литералы ANSI, приложение вызывает SQLGetInfo с параметром SQL_ANSI_SQL_DATETIME_LITERALS.
Чтобы определить, поддерживает ли драйвер escape-последовательности ODBC для литерала интервалов, приложение вызывает SQLGetTypeInfo. Если источник данных поддерживает тип данных интервала даты и времени, он также должен поддерживать соответствующую escape-последовательность.
Источники данных также могут поддерживать литералы даты и времени, определенные в спецификации ANSI SQL-92, которые отличаются от escape-последовательностей ODBC для литералы интервала даты и времени. Чтобы определить, поддерживает ли источник данных литералы ANSI, приложение вызывает SQLGetInfo с параметром SQL_ANSI_SQL_DATETIME_LITERALS.