我正在尝试运行此Oracle查询...
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:
有人有什么想法吗?说它是一种不一致的数据类型......但我想我完全不理解。
由于
顺便说一句,这是我的exit_responses表的DESC:
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 :(得分:3)
假设sdate
的日期类型是Oracle DATE,请使用TO_DATE function将字符串转换为Oracle中的DATE:
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 :(得分:2)
SDATE列的数据类型是什么?假设它是DATE,您几乎肯定希望使用显式的TO_DATE调用将字符串转换为日期,即。
WHERE sdate BETWEEN to_date('03-Aug-2010', 'DD-MON-YYYY')
AND to_date( '03-Nov-2010', 'DD-MON-YYYY' )
由于午夜是指定none时的默认时间,因此您不一定需要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是DATE并且你希望BETWEEN采用两个不同的Unix纪元(自1970年1月1日以来的毫秒)而不是字符串,你会想要类似
的东西WHERE sdate BETWEEN date '1970-01-01' + :1/86400000
AND date '1970-01-01' + :2/86400000
其中:1和:2是两个绑定变量。如果您的纪元是自1970年1月1日以来的秒数
WHERE sdate BETWEEN date '1970-01-01' + :1/86400
AND date '1970-01-01' + :2/86400
答案 2 :(得分: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;
答案 3 :(得分:1)
对ORACLE一无所知,我敢打赌你实际上不能在GROUP BY
字段上CLOB
。这很有道理......
另外,请看this。摘录:
从Oracle的角度来看这很重要,因为你不能在clob上做一个小组。为了进行分组,你需要能够排序和clob字段没有自然的排序顺序。解决方法是在clob字段上执行to_char函数,但最多可以获得4000个字符。对我来说,这符合要求,因为我需要的子串是一个小字符串。但问题是我需要在clob字段中对XML标记的一部分进行排序,并根据它对它们进行分组。不仅如此,我还需要在XML消息中找到特定类型的错误并对其进行计数。
答案 4 :(得分: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')