2011-10-05 1 views
0

J'ai une requête commeC, unixODBC, oracle et date interroge

select x from tableName where startDate <= now; 

Quand j'interroger la base sans les champs de date, tout fonctionne comme prévu. Dès que je commence à utiliser des colonnes de date ou d'horodatage dans la base de données Oracle, mes requêtes ne retournent rien ou une erreur.

Ce que je fais:

snprintf(sql, sizeof(sql), "SELECT roomNo, userPass, adminPass, adminFlags, userFlags, bookId, is_locked, running_on_server FROM booking WHERE roomNo = '?' AND startTime <= { ts '?' } AND endTime >= { ts '?' } for update;");        
     stmt = ast_odbc_prepare_and_execute(obj, generic_prepare, &gps); 

la? seront remplacées par des valeurs, avec la commande suivante:

SQLBindParameter(stmt, i + 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(gps->argv[i]), 0, gps->argv[i], 0, NULL); 

quand j'exécute la requête que je reçois une erreur TS est un identifiant valide [ce fut une recommandation par un autre conseil, prise de msdn - ce qui peut provoquer cette erreur ]

mais même si je le supprime et n'envoie qu'une chaîne à la base de données, j'obtiendrai un résultat vide. J'ai également essayé de lier les paramètres comme SQL_TIMESTAMP et SQL_DATE, mais cela n'a pas aidé non plus.

J'espère que quelqu'un peut m'aider.

merci d'avance. Chris

Répondre

0

Envoyez-vous un type de données DATE à la requête Oracle ou une date représentée dans une chaîne? Du côté d'Oracle, si vous envoyez une date dans une variable de chaîne, vous devrez utiliser la fonction "TO_DATE" de l'oracle (http://www.techonthenet.com/oracle/functions/to_date.php) pour ensuite convertir la chaîne thew en une date à utiliser dans votre instruction SQL (en supposant que startDate ou startTime/endTime sont des colonnes DATE dans la base de données).

Votre exemple poing SQL doit être:

SELECT x 
    FROM tableName 
WHERE startDate <= TO_DATE(now, '<date-format>'); 

Si la variable "maintenant" est une chaîne contenant '05 2011 16:15:23' -OCT (y compris une partie de temps), la to_date serait être:

TO_DATE(now, 'DD-MON-YYYY HH24:MI:SS') 

Si vous comparez une chaîne avec une date et ne spécifiez pas le format de cette date Oracle utilisera ses paramètres par défaut du SNA et essayer d'appliquer ce format. Par conséquent, il est toujours prudent de spécifier le format de date en utilisant TO_DATE.

Espérons que ça aide ...