2011-08-29 2 views
1

Voici une simple requête:Unhelpful message d'erreur Oracle: attendu% s, a obtenu% de l'aide de to_date

SELECT COUNT(*) FROM m_bug_t 
WHERE date_submitted BETWEEN TO_DATE('2011-08-22','yyyy-mm-dd') AND TO_DATE('2011-08-29','yyyy-mm-dd') 
AND status != 100 

qui donne le message d'erreur suivant

ORA-00932: inconsistent datatypes: expected NUMBER got DATE 
00932. 00000 - "inconsistent datatypes: expected %s got %s" 
*Cause:  
*Action: 
Error at Line: 2 Column: 22 

Toutes les idées? J'utilise pour utiliser MySQL où cela fonctionne même sans la fonction to_date.

+0

De quel type est la 'data_submitted' colonne? – skaffman

+0

Vous avez raison. C'est un nombre (10,0). Aucun moyen de réparer cela? Vous devez être capable de le convertir en une date dans Oracle, n'est-ce pas? C'est un entier avec le nombre de secondes à partir de 1970 ou quelque chose comme ça ... – ale

+0

Je ne pense pas qu'Oracle offre un moyen de convertir la valeur millis en 'DATE'. Vous allez devoir convertir cette table vous-même. Pourquoi l'avez-vous stocké comme NUMERIC pour commencer? – skaffman

Répondre

4

Conversion dates Oracle à des valeurs d'horodatage unix nécessite la fonction suivante:

SELECT (sysdate - to_date('01-JAN-1970','DD-MON-YYYY')) * (86400) as dt FROM dual; 

ou dans le cas de votre sql clause where:

WHERE date_submitted between 
    ((TO_DATE('2011-08-22', 'yyyy-mm-dd') - to_date('01-JAN-1970','DD-MON-YYYY')) * (86400)) 
AND 
    ((TO_DATE('2011-08-29', 'yyyy-mm-dd') - to_date('01-JAN-1970','DD-MON-YYYY')) * (86400)) 
5

Il semble que la colonne date_submitted soit numérique et que vous essayez de la comparer à une date. Oracle ne vous laissera pas faire cela.

[EDIT :] En supposant que le Epoch est le 1 janvier 1970, vous devriez pouvoir utiliser:

TO_DATE('01/01/1970 00:00:00', 'MM-DD-YYYY HH24:MI:SS') + (date_submitted/(24 * 60 * 60)) 

Pour obtenir la date réelle qui est représentée. Je ne suis pas sûr si ce sera exact à 100%, puisque votre date en secondes peut ne pas inclure les secondes intercalaires et Oracle le fait probablement.

+0

Vous avez raison. C'est un nombre (10,0). Aucun moyen de réparer cela? Vous devez être capable de le convertir en une date dans Oracle, n'est-ce pas? C'est un nombre entier avec le nombre de secondes de 1970 ou quelque chose comme ça ... – ale

Questions connexes