Littéraux de date, d’heure et d’horodatage

La séquence d’échappement pour les littéraux de date, heure et horodateur est la suivante :

{ -type ' value '}

literal-type est l’une des valeurs répertoriées dans la table suivante.

literal-type Signification Format de value
d Date aaaa-mm-jj
t Heure* hh:mm:ss[1]
ts Timestamp yyyy-mm-dd hh:mm:ss[.f...][1]

[1] Le nombre de chiffres à droite du point décimal dans un littéral d’intervalle de temps ou d’horodateur contenant un composant de secondes dépend de la précision des secondes, comme contenu dans le champ de descripteur SQL_DESC_PRECISION. (Pour plus d’informations, consultez SQLSetDescField.)

Pour plus d’informations sur les séquences d’échappement de date, d’heure et d’horodateur, consultez Séquences d’échappement de date, d’heure et d’horodateur dans l’annexe C : Grammaire SQL.

Par exemple, les deux instructions SQL suivantes mettent à jour la date d’ouverture de la commande client 1023 dans la table Commandes. La première instruction utilise la syntaxe de la séquence d'échappement. La deuxième instruction utilise la syntaxe native d’Oracle Rdb pour la colonne DATE. Cette dernière n’est pas interopérable.

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

La séquence d’échappement d’un littéral de date, d’heure ou d’horodateur peut également être placée dans une variable de caractère liée à un paramètre de date, d’heure ou d’horodateur. Par exemple, le code suivant utilise un paramètre de date lié à une variable de caractère pour mettre à jour la date d’ouverture de la commande client 1023 dans la table Commandes :

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

Toutefois, il est généralement plus efficace de lier le paramètre directement à une structure de date :

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

Pour déterminer si un pilote prend en charge les séquences d’échappement ODBC pour les littéraux de date, d’heure ou d’horodateur, une application appelle SQLGetTypeInfo. Si la source de données prend en charge un type de données de date, d’heure ou d’horodateur, elle doit également prendre en charge la séquence d’échappement correspondante.

Les sources de données peuvent également prendre en charge les littéraux DateHeure définis dans la spécification ANSI SQL-92, qui sont différents des séquences d’échappement ODBC pour les littéraux de date, d’heure ou d’horodateur. Pour déterminer si une source de données prend en charge les littéraux ANSI, une application appelle SQLGetInfo avec l’option SQL_ANSI_SQL_DATETIME_LITERALS.

Pour déterminer si un pilote prend en charge les séquences d’échappement ODBC pour les littéraux d’intervalle, une application appelle SQLGetTypeInfo. Si la source de données prend en charge un type de données d’intervalle DateHeure, elle doit également prendre en charge la séquence d’échappement correspondante.

Les sources de données peuvent également prendre en charge les littéraux DateHeure définis dans la spécification ANSI SQL-92, qui sont différents des séquences d’échappement ODBC pour les littéraux d’intervalle DateHeure. Pour déterminer si une source de données prend en charge les littéraux ANSI, une application appelle SQLGetInfo avec l’option SQL_ANSI_SQL_DATETIME_LITERALS.