Поделиться через


Литералы даты, времени и отметок времени

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.