trunc(date)总是给出错误

时间:2014-09-08 14:43:42

标签: sql oracle date

Hiii

看看这个请求并告诉我为什么Oracle总是给我这个错误

ORA-00932: inconsistent datatypes: expected DATE got NUMBER
00932. 00000 -  "inconsistent datatypes: expected %s got %s"

注1:当我删除TRUNK()它的工作但是我把它放在了请求上

注意2:我使用此日期格式1/07/20141-07-20141/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

3 个答案:

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