1

使用这些参数运行以下 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_ORDERF_NUMBER=调用 XDO 数据引擎...--SQLException java.sql.SQLDataException: ORA-01861: 文字与格式字符串不匹配

4

1 回答 1

1

ORA-01861: 文字与格式字符串不匹配

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

例如,

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同时具有日期和时间元素。当您不提及时间部分时,它默认为午夜,即00:00:00

例如,添加INTERVAL '86399' SECOND

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
于 2015-11-18T08:50:11.160 回答