Hiii
看看这个请求并告诉我为什么Oracle总是给我这个错误
ORA-00932: inconsistent datatypes: expected DATE got NUMBER
00932. 00000 - "inconsistent datatypes: expected %s got %s"
注1:当我删除TRUNK()
它的工作但是我把它放在了请求上
注意2:我使用此日期格式1/07/2014
或1-07-2014
和1/JUL/2014
始终存在相同的错误
这是我的要求
SELECT
QTYORDERED,
LINENETAMT
FROM C_Orderline
INNER JOIN C_Order
ON (C_Orderline.C_Order_ID = C_Order.C_Order_ID)
WHERE C_Order.ad_org_id = 1401007
AND C_order.DOCSTATUS = 'CO'
AND (TRUNC('1-jul-2014' ) IS NULL
OR C_order.DATEORDERED >= TRUNC('1-jul-2014'))
AND (TRUNC('4-sep-2014') IS NULL
OR C_order.DATEORDERED <= TRUNC('4-sep-2014'))
ORDER BY c_order.ad_org_id,C_order.DATEORDERED DESC
答案 0 :(得分:3)
没有理由在这样的常量上使用trunc()
。嘿,只需使用date
关键字并以ISO标准格式指定日期:
WHERE C_Order.ad_org_id = 1401007 AND
C_order.DOCSTATUS = 'CO' AND
(DATE '2014-07-01' IS NULL OR C_order.DATEORDERED >= DATE '2014-07-01') AND
(DATE '2014-09-04' IS NULL OR C_order.DATEORDERED <= DATE '2014-07-01')
如果您想保留日期格式,请使用to_date('1-jul-2014', 'DD-MON-YYYY')
将值转换为日期。
答案 1 :(得分:2)
这不是DATE
数据类型。这是一个字符串文字。并且存在从VARCHAR到NUMBER的隐式转换。就是这样:
TRUNC('1-jul-2014')
相当于:
TRUNC(TO_NUMBER('1-jul-2014'))
这是对TO_NUMBER函数的(隐式)调用抛出异常。
优化器在比较的一侧找到DATE
(即对DATEORDER列的引用),并在另一侧找到NUMBER
(上面表达式的结果)。导致错误的比较两侧数据类型的“不匹配”。
如果要从字符串文字中返回DATE
数据类型,可以使用适当的格式掩码显式调用TO_DATE
函数,例如
TO_DATE('1-jul-2014','dd-mon-yyyy')
由于返回的DATE
值的时间分量将设置为午夜,因此无需调用TRUNC
函数(这只会将时间组件设置为午夜。)但它会是不必要的,但有效的,将该表达式包装在TRUNC
函数中。
答案 2 :(得分:1)
我认为问题出在您的专栏DATEORDERED
NUMBER
可能
这里有一个例子。
SQL> select * from dual where trunc(to_DATE('04-SEP-2014','DD-MON-YYYY')) > 100;
select * from dual where trunc(to_DATE('04-SEP-2014','DD-MON-YYYY')) > 100
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected DATE got NUMBER
这不会引发错误。因此,Oracle将04-SEP-2014
识别为日期
SQL> select * from dual where trunc(to_DATE('04-SEP-2014','DD-MON-YYYY')) > '04-SEP-2014';
no rows selected
因此,您必须分析其中的当前数据。与其匹配的任何日期格式。
诸如“20140409
”之类的内容 - &gt; 'YYYYDDMM
'
然后尝试TO_DATE(C_order.DATEORDERED,'YYYYDDMM') <= TRUNC(TO_DATE('4-sep-2014','DD-mon-yyyy'))