Datums-, Zeit- und Zeitstempelliterale

Die Escapesequenz für Datums-, Zeit- und Timestampliterale lautet:

{ -type ' value '}

wobei literal-type einer der in der folgenden Tabelle aufgeführten Werte ist.

literal-type Bedeutung Format des Werts
d Datum yyyy-mm-dd
t Uhrzeit* hh:mm:ss[1]
ts Timestamp yyyy-mm-dd hh:mm:ss[.f...][1]

[1] Die Anzahl der Ziffern rechts neben dem Dezimalkomma in einem Zeit- oder Zeitstempelintervallliteral, das eine Sekundenkomponente enthält, hängt von der Sekundengenauigkeit ab, wie im Deskriptorfeld SQL_DESC_PRECISION enthalten. (Weitere Informationen finden Sie unter SQLSetDescField.)

Weitere Informationen zu den Escapesequenzen für Datum, Uhrzeit und Zeitstempel finden Sie unter Datum-, Uhrzeit- und Zeitstempel-Escapesequenzen in Anhang C: SQL-Grammatik.

Beispielsweise aktualisieren beide der folgenden SQL-Anweisungen das Öffnungsdatum des Verkaufsauftrags 1023 in der Tabelle Bestellungen. Die erste Anweisung verwendet die Escapesequenz-Syntax. Die zweite Anweisung verwendet die native Oracle Rdb Syntax für die Spalte DATUM und ist nicht interoperabel.

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

Die Escapesequenz für ein Datums-, Uhrzeit- oder Zeitstempelliteral kann auch in einer Zeichenvariable platziert werden, die an einen Datums-, Uhrzeit- oder Zeitstempelparameter gebunden ist. Der folgende Code verwendet beispielsweise einen Datumsparameter, der an eine Zeichenvariable gebunden ist, um das Öffnungsdatum des Verkaufsauftrags 1023 in der Tabelle Bestellungen zu aktualisieren:

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);  

In der Regel ist es jedoch effizienter, den Parameter direkt an eine Datumsstruktur zu binden:

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);  

Um festzustellen, ob ein Treiber die ODBC-Escapesequenzen für Datums-, Uhrzeit- oder Zeitstempelliterale unterstützt, ruft eine Anwendung SQLGetTypeInfo auf. Wenn die Datenquelle einen Datentyp für Datum, Uhrzeit oder Zeitstempel unterstützt, muss sie auch die entsprechende Escapesequenz unterstützen.

Datenquellen können auch die in der ANSI SQL-92-Spezifikation definierten Datetime-Literale unterstützen, die sich von den ODBC-Escapesequenzen für Datums-, Uhrzeit- oder Zeitstempelliterale unterscheiden. Um festzustellen, ob eine Datenquelle die ANSI-Literale unterstützt, ruft eine Anwendung SQLGetInfo mit der Option SQL_ANSI_SQL_DATETIME_LITERALS auf.

Um festzustellen, ob ein Treiber die ODBC-Escapesequenzen für Intervalllliterale unterstützt, ruft eine Anwendung SQLGetTypeInfo auf. Wenn die Datenquelle einen Datentyp mit Zeitintervall unterstützt, muss sie auch die entsprechende Escapesequenz unterstützen.

Datenquellen können auch die in der ANSI SQL-92-Spezifikation definierten Datetime-Literale unterstützen, die sich von den ODBC-Escapesequenzen für Datetime-Intervallliterale unterscheiden. Um festzustellen, ob eine Datenquelle die ANSI-Literale unterstützt, ruft eine Anwendung SQLGetInfo mit der Option SQL_ANSI_SQL_DATETIME_LITERALS auf.