使用这些参数运行时的以下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与格式字符串
不匹配
答案 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