2010-11-02 12 views
1

je tente d'exécuter cette requête Oracle ...Erreur ORA-00932. Je ne sais pas comment fixer

SELECT COUNT(*) as total, 
     q1 
    FROM exit_responses 
    WHERE sdate BETWEEN '03-Aug-10 12:00:00 AM' AND '03-Nov-10 12:00:00 AM' 
GROUP BY q1; 

... mais je continue à obtenir cette erreur ...

Error starting at line 3 in command: 
SELECT COUNT(*) as total, q1 FROM exit_responses WHERE sdate BETWEEN '03-Aug-10 12:00:00 AM' AND '03-Nov-10 12:00:00 AM' GROUP BY q1 
Error at Command Line:3 Column:130 
Error report: 
SQL Error: ORA-00932: inconsistent datatypes: expected - got CLOB 
00932. 00000 - "inconsistent datatypes: expected %s got %s" 
*Cause:  
*Action: 

Tout le monde a des idées? Dit que c'est un type de données incohérent ... mais je suppose que je ne comprends pas complètement.

Merci

BTW, voici le CEEPC de ma table exit_responses:

DESC exit_responses 
Name       Null  Type                                               
------------------------------ -------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
SDATE         DATE                                               
F_NAME         VARCHAR2(255 CHAR)                                            
L_NAME         VARCHAR2(255 CHAR)                                            
TITLE         VARCHAR2(255 CHAR)                                            
DEPARTMENT        VARCHAR2(255 CHAR)                                            
EMP_TYPE        VARCHAR2(11 CHAR)                                            
LENGTH_OF_SERVICE      VARCHAR2(255 CHAR)                                            
Q1          CLOB()                                               
Q2          CLOB()                                               
Q2_OTHER        CLOB()                                               
Q3_PAY         NUMBER                                               
Q3_HOLIDAYS        NUMBER                                               
Q3_VACATION        NUMBER                                               
Q3_SICK         NUMBER                                               
Q3_INSURANCE       NUMBER                                               
Q3_RETIREMENT       NUMBER                                               
Q3_FSA         NUMBER                                               
Q4_AVAILABILITY       NUMBER                                               
Q4_QUALITY        NUMBER                                               
Q4_SATISFACTION       NUMBER                                               
Q4_COMMENTS        NUMBER                                               
Q5_ORIENTATION       NUMBER                                               
Q5_POLICIES        NUMBER                                               
Q5_PROMOTIONAL       NUMBER                                               
Q6_JOBDUTIES       NUMBER                                               
Q6_RELATIONSHIPS      NUMBER                                               
Q6_COOPERATION       NUMBER                                               
Q6_EQUIPMENT       NUMBER                                               
Q6_CONDITIONS       NUMBER                                               
Q6_SAFETY        NUMBER                                               
Q7          NUMBER                                               
Q8_KNOWLEDGE       NUMBER                                               
Q8_DELEGATION       NUMBER                                               
Q8_OBSERVANCE       NUMBER                                               
Q8_FEEDBACK        NUMBER                                               
Q8_CONTRIBUTIONS      NUMBER                                               
Q8_LISTENED        NUMBER                                               
Q8_COMPLAINTS       NUMBER                                               
Q9          VARCHAR2(3 CHAR)                                            
Q9_DESCRIBE        CLOB()                                               
Q10          CLOB()                                               
Q11          NUMBER                                               
Q11_COMMENTS       CLOB()                                               
Q12          NUMBER                                               
Q12_DESCRIBE       CLOB()                                               
ADDITIONAL_COMMENTS      CLOB() 
+0

# 1 - Acceptez quelques réponses à vos questions.# 2 - postez votre 'desc exit_responses' – KevinDTimm

Répondre

2

Quel est le type de données de la colonne SDATE? En supposant qu'il est une date, vous voudrez certainement utiliser des appels TO_DATE explicite pour convertir vos chaînes dates, à savoir

WHERE sdate BETWEEN to_date('03-Aug-2010', 'DD-MON-YYYY') 
       AND to_date('03-Nov-2010', 'DD-MON-YYYY') 

Depuis minuit, est le temps par défaut lorsque aucun n'est spécifié, vous ne devez pas nécessairement le 12: 00:00 AM peu. Si vous souhaitez inclure que

WHERE sdate BETWEEN to_date('03-Aug-2010 12:00:00 AM', 'DD-MON-YYYY HH:MI:SS AM') 
       AND to_date('03-Nov-2010 12:00:00 AM', 'DD-MON-YYYY HH:MI:SS AM') 

Si SDATE est une date et que vous voulez BETWEEN prendre deux époques Unix différentes (millisecondes depuis le 1er janvier 1970) plutôt que des chaînes, vous voulez quelque chose comme

WHERE sdate BETWEEN date '1970-01-01' + :1/86400000 
       AND date '1970-01-01' + :2/86400000 

où: 1 et: 2 sont les deux variables de liaison. Si vos époques sont secondes depuis le 1er janvier 1970

WHERE sdate BETWEEN date '1970-01-01' + :1/86400 
       AND date '1970-01-01' + :2/86400 
+0

Y a-t-il un moyen de convertir un horodatage unix en utilisant to_date? Il semble encombrant de convertir de timestamp en chaîne avec php, puis de convertir la chaîne en une date w/to_date(). – Will

+0

Si vous parlez d'une période Unix (c'est-à-dire le nombre de millisecondes depuis le 1er janvier 1970), vous avez juste besoin de l'arithmétique de date Oracle. Date '1970-01-01' + <>/86400000 donne la date Oracle correspondant au spécifié <> –

+0

En fait ... je l'avais en tant que type TIMESTAMP ... maintenant il ne fonctionnera pas de mes requêtes quand je l'ai changé en type de colonne DATE. Que devrais-je avoir comme? (ce qui serait le meilleur) – Will

3

En supposant type date de sdate est Oracle DATE, utilisez le TO_DATE function pour convertir une chaîne à une date dans Oracle:

SELECT COUNT(*) as total, 
     q1 
    FROM exit_responses 
    WHERE sdate BETWEEN TO_DATE('03-Aug-10 12:00:00 AM', 'DD-MON-YY HH12:MI:SS AM') 
        AND TO_DATE('03-Nov-10 12:00:00 AM', 'DD-MON-YY HH12:MI:SS AM') 
GROUP BY q1; 
1

je suppose que sdate est une date ou DATETIME, auquel cas vous devez convertir vos chaînes de date:

SELECT COUNT(*) as total, 
     q1 
    FROM exit_responses 
    WHERE sdate BETWEEN to_date('03-Aug-10 12:00:00 AM') AND to_date('03-Nov-10 12:00:00 AM') 
GROUP BY q1; 
0

je pense, il est préférable d'utiliser la fonction to_date pour cela.

where sdate between 
    TO_DATE('03.08.2010:00:00:0','DD.MM.YYYY:HH24:MI:SS') and TO_DATE('03.10.2010:00:00:0','DD.MM.YYYY:HH24:MI:SS') 
1

Ne sachant pas quoi que ce soit sur Oracle, je serais prêt à parier que vous ne pouvez pas en fait GROUP BY sur CLOB champs. Cela prend tout son sens ...

Voir aussi this. Extrait:

Cela était important du point de vue Oracle car vous ne pouvez pas faire un groupe sur un clob. Pour faire un groupe, vous devez être en mesure de trier et les champs de clob n'ont pas d'ordre de tri naturel. La solution de contournement consiste à faire une fonction to_char sur le champ clob, mais vous pouvez obtenir un maximum de 4000 caractères. Pour moi, cela convenait à l'exigence parce que la sous-chaîne dont j'avais besoin était une petite chaîne. Mais le problème est que j'avais besoin de trier une partie d'une balise XML dans le champ clob et de les regrouper en fonction de cela. Non seulement je devais trouver un type spécifique d'erreur dans le message XML et les compter.

+0

Daniel, vous avez raison. 'LOB' ne peut pas être utilisé dans une clause' GROUP BY'. http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10002.htm#SQLRF01702 –