2010-11-02 3 views
1

Я пытаюсь запустить этот запрос Oracle ...Ошибка ORA-00932. Не знаю, как исправить

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 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: 

Кто-нибудь есть какие-нибудь идеи? Говорит, что это непоследовательный тип данных ... но я думаю, что я не понимаю полностью.

Благодаря

Btw, вот DESC моего стола 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 - принять некоторые ответы на ваши вопросы.# 2 - опубликуйте свой 'desc exit_responses' – KevinDTimm

ответ

2

Каков тип данных столбца SDATE? Если предположить, что это дата, вы почти наверняка хотите использовать явные TO_DATE вызовы для преобразования строк в даты, т.е.

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

С полуночи время по умолчанию, если не указано, то вам не обязательно нужен 12: 00:00 AM бит. Если вы хотите включить, что

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

Если SDATE является ДАТА и вы хотите BETWEEN взять две разные эпохи Unix (миллисекунды начиная с 1 января 1970 г.), а не строки, вы хотели бы что-то вроде

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

где: 1 и: 2 - две переменные связывания. Если эпох секунд с 1 января 1970

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

Есть ли способ конвертировать временную метку unix с помощью to_date? Кажется громоздким преобразовать из timestamp в строку с php, а затем преобразовать строку в дату w/to_date(). – Will

+0

Если вы говорите об эпохе Unix (т. Е. О миллисекундах с 1 января 1970 года), вам просто нужна арифметика даты Oracle. дата «1970-01-01» + <>/86400000 дает дату Oracle, соответствующий указанному <> –

+0

На самом деле ... Я был как тип столбца TIMESTAMP ... теперь он не будет работать какой-либо из мои запросы, когда я изменил его на тип столбца DATE. Что я должен иметь? (что было бы лучше) – Will

3

Предполагая sdate «s тип даты является Oracle DATE, используйте TO_DATE function, чтобы преобразовать строку в дату в 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

мое предположение, что sdate является DATE или столбец DATETIME, в этом случае вам нужно преобразовать строки даты:

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

я думаю, для этого лучше использовать функцию to_date.

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

Не зная ничего о ORACLE, я бы поставил, что ты в самом деле не может GROUP BY на CLOB поля. Это имеет смысл ...

Также посмотрите на this. Выдержка:

Это было важно с точки зрения Oracle, потому что вы не можете делать группу на клобе. Для того, чтобы сделать группу, вы должны иметь возможность сортировать поля и поля clob, которые не имеют естественного порядка сортировки. Обходным путем является выполнение функции to_char в поле clob, но вы можете получить максимум 4000 символов. Для меня это соответствовало требованию, потому что подстрока, в которой я нуждалась, была маленькой строкой. Но проблема в том, что мне нужно было отсортировать часть тега XML внутри поля clob и сгруппировать их на основе этого. Мало того, что мне нужно было найти определенный тип ошибки в XML-сообщении и подсчитать их.

+0

Даниил, вы правы. 'LOB' не могут использоваться в предложении GROUP BY. http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10002.htm#SQLRF01702 –

Смежные вопросы