oracle应用报告中的日期范围

时间:2015-11-18 08:12:38

标签: sql oracle date-formatting bi-publisher oracle-apps

使用这些参数运行时的以下sql,

:P_COMP_DATE_FROM =' 15-NOV-2015' :P_COMP_DATE_TO =' 15-NOV-2015'

比较时间为15-NOV-2015 00:00:00'和' 15-NOV-2015 00:00:00'

Select Ordered_date
From xxcost_rep
Where DATE_COMPLETED BETWEEN NVL(fnd_date.canonical_to_date(:P_COMP_DATE_FROM), DATE_COMPLETED) AND NVL(fnd_date.canonical_to_date(:P_COMP_DATE_TO)), DATE_COMPLETED);

如何将其作为当天的开始和当天结束进行比较,以便在该范围内显示正确的结果。

我正在尝试以下操作添加86399秒以使其结束当天,但收到错误:

WHERE DATE_COMPLETED BETWEEN NVL(fnd_date.canonical_to_date(:P_COMP_DATE_FROM), DATE_COMPLETED) AND NVL(fnd_date.canonical_to_date(to_date(:P_COMP_DATE_TO,'DD-MON-YYYY')+interval '86399' second), DATE_COMPLETED)
  

{P_TO_CUSTOMER =,P_COMP_DATE_FROM = 2015/11/15 00:00:00,P_COMP_DATE_TO = 2015/11/15 00:00:00,P_TO_ORDER_NUMBER =,P_CUST_REGION =,P_TO_DATE =,P_JOB_STATUS =,P_FROM_DATE =,P_FROM_ORDER_NUMBER = ,P_FROM_CUSTOMER =}   调用XDO数据引擎......   --SQLException   java.sql.SQLDataException:ORA-01861:literal与格式字符串

不匹配

1 个答案:

答案 0 :(得分:1)

  

ORA-01861:literal与格式字符串

不匹配

上述错误是因为日期文字与格式掩码不匹配。

例如,

SQL> SELECT TO_DATE('2015118','yyyy/mm/dd') FROM dual;
SELECT TO_DATE('2015118','yyyy/mm/dd') FROM dual
               *
ERROR at line 1:
ORA-01861: literal does not match format string

您可能将日期存储为字符串,并且可能存在具有不同日期格式的字符串。因此,使用 TO_DATE 转换为 DATE 时,您的函数fnd_date.canonical_to_date可能无法使用此类日期文字。

此外,您不应该依赖客户端的NLS日期格式。请记住, TO_DATE 取决于NLS。您应该明确提及格式掩码

例如,

SQL> SELECT  to_date('11/18/2015 00:00:00', 'mm/dd/yyyy hh24:mi:ss') date_from,
  2          to_date('11/18/2015 23:59:59', 'mm/dd/yyyy hh24:mi:ss') date_to
  3  FROM dual;

DATE_FROM           DATE_TO
------------------- -------------------
11/18/2015 00:00:00 11/18/2015 23:59:59

在您的情况下,您需要比较日期。你可以像下面的例子那样做,

SQL> WITH DATA AS(
  2  SELECT DATE '2015-11-18' dt FROM dual
  3  )
  4  SELECT * FROM DATA
  5  WHERE dt
  6  BETWEEN to_date(
  7                  to_char(dt, 'mm/dd/yyyy')||' 00:00:00',
  8                  'mm/dd/yyyy hh24:mi:ss'
  9                 )
 10  AND     to_date(
 11                  to_char(dt, 'mm/dd/yyyy')||' 23:59:59',
 12                  'mm/dd/yyyy hh24:mi:ss'
 13                 );

DT
-------------------
11/18/2015 00:00:00

<强>更新

对于您只需要开始时间的第一部分,您不必将时间部分添加为00:00:00,因为 DATE 同时包含日期和时间元素< / strong>即可。如果您未提及时间部分,则默认为午夜,即00:00:00

例如,添加 INTERVAL'866399'Seconding

SQL> SELECT DATE '2015-11-18' from_date,
  2         DATE '2015-11-18' + INTERVAL '86399' SECOND to_date
  3  FROM dual;

FROM_DATE           TO_DATE
------------------- -------------------
11/18/2015 00:00:00 11/18/2015 23:59:59