2017-06-28 1 views
0

J'essaie d'utiliser cx_Oracle pour interroger une table dans Oracle DB (version 11.2) et obtenir des lignes avec des valeurs dans une colonne entre une plage datetime.python oracle où la clause contenant la date est supérieure à la comparaison

J'ai essayé les approches suivantes:

  1. Essayé entre l'article comme décrit here, mais le curseur obtient 0 lignes

    parameters = (startDateTime, endDateTime) 
    query = "select * from employee where joining_date between :1 and :2" 
    cur = con.cursor() 
    cur.execute(query, parameters) 
    
  2. Essayé la fonction TO_DATE() et date '' qualifiés. Toujours aucun résultat pour Between or> = operator. Il convient de noter que l'opérateur < fonctionne. J'ai également obtenu la même requête et essayé dans un client sql, et la requête renvoie des résultats. Code:

    #returns no rows: 
    query = "select * from employee where joining_date >= TO_DATE('" + startDateTime.strftime("%Y-%m-%d") + "','yyyy-mm-dd')" 
    cur = con.cursor() 
    cur.execute(query) 
    #tried following just to ensure that some query runs fine, it returns results: 
    query = query.replace(">=", "<") 
    cur.execute(query) 
    

Les pointeurs sur pourquoi entre et> = opérateurs ne parviennent pas pour moi? (Ma deuxième approche est conforme à la réponse à Oracle date comparison in where clause mais ne fonctionne toujours pas pour moi)

J'utilise python et utilisé cx_Oracle 3.4.3 5.3 et 5.2 avec le client Oracle 11g sur la machine windows 7

+0

Aucune idée, vraiment, juste une pensée ... Je n'ai pas vu "yyy" comme un élément de format de date, et je ne suis pas sûr si cela peut gâcher les choses. Je suppose que vous vouliez dire «yyyy» (année à quatre chiffres) ou peut-être juste «yy». Corrigez cela et voyez si ça aide. – mathguy

+0

Oui, yyy était une faute de frappe ici, mon code l'a corrigé – Sandip

Répondre

1

Supposons que la table de votre employé contienne le champ emp_id et que la ligne emp_id=1234567 soit récupérée par votre requête.

Faites deux copies de votre programme qui exécutent les requêtes suivantes

query = "select to_char(:1,'YYYY-MM-DD HH24:MI:SS')||' >= '||to_char(joining_date,'YYYY-MM-DD HH24:MI:SS')||' >= '||to_char(:2,'YYYY-MM-DD HH24:MI:SS') resultstring from employee where emp_id=1234567" 

et

query="select to_char(joining_date,'YYYY-MM-DD HH24:MI:SS')||' >= '||to_char(TO_DATE('" + startDateTime.strftime("%Y-%m-%d") + "','yyyy-mm-dd'),'YYYY-MM-DD HH24:MI:SS') resultstring from employee where emp_id=1234567" 

Montrez-nous le code et la valeur de la colonne resultstring

+0

En fait, j'avais compris le problème, qui était une erreur humaine de mon côté. J'avais deux bases de données avec le même schéma. Je cassais la requête et la même chose dans un client sql (je courais par erreur sur une autre DB), et obtenait des résultats. Enfin repéré et fixé. Je vais marquer votre réponse en tant que réponse que ceci et des questions similaires m'auraient aidé à comprendre cela beaucoup plus tôt. – Sandip

0

Vous construisez des requêtes SQL en tant que chaînes lorsque vous devez utiliser parameterized queries. Vous ne pouvez pas utiliser le paramétrage pour substituer les opérateurs de comparaison, mais vous devez l'utiliser pour les dates.

Notez également que la réponse référencée utilise le format de paramétrage PostgreSQL, tandis que Oracle vous oblige à utiliser le format ":name".

+0

Merci pour l'entrée, mais mon premier essai dans la question utilise une requête paramétrée. C'est presque le même que ce qui est sur le lien que j'ai fourni, seulement une différence qu'ils définissent le littéral de chaîne en utilisant des guillemets. Donc ça aurait dû marcher. Ou est-ce qu'il me manque quelque chose? cx_Oracle devrait supporter même le format ": number" selon cette page – Sandip

+0

Mon mauvais - vous ne semblez rien manquer et je m'attendais à ce que votre approche paramétrée fonctionne. Comme je me souviens de ma syntaxe Oracle (il y a très longtemps), vous pouvez utiliser des chaînes littérales comme "MM-JJ-AAAA" comme constantes de date. Peut-être que cela aidera à formuler une alternative? – holdenweb