Oracle 应用报告中的日期范围
date range in oracle apps report
下面sql当运行加上这些参数时,
:P_COMP_DATE_FROM = '15-NOV-2015'
:P_COMP_DATE_TO = '15-NOV-2015'
比较“2015 年 11 月 15 日 00:00:00”和“2015 年 11 月 15 日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=}
Calling XDO Data Engine...
--SQLException
java.sql.SQLDataException: ORA-01861: literal does not match format string
ORA-01861: literal does not match format string
以上错误是因为日期文字与格式掩码不匹配。
例如,
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
您可能将日期存储为字符串,并且可能存在具有不同日期格式的字符串。因此,您的函数 fnd_date.canonical_to_date
在使用 TO_DATE.[=18 转换为 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 同时具有 日期和时间元素。当您不提及时间部分时,它默认为 midnight 即 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
下面sql当运行加上这些参数时,
:P_COMP_DATE_FROM = '15-NOV-2015' :P_COMP_DATE_TO = '15-NOV-2015'
比较“2015 年 11 月 15 日 00:00:00”和“2015 年 11 月 15 日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=} Calling XDO Data Engine... --SQLException java.sql.SQLDataException: ORA-01861: literal does not match format string
ORA-01861: literal does not match format string
以上错误是因为日期文字与格式掩码不匹配。
例如,
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
您可能将日期存储为字符串,并且可能存在具有不同日期格式的字符串。因此,您的函数 fnd_date.canonical_to_date
在使用 TO_DATE.[=18 转换为 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 同时具有 日期和时间元素。当您不提及时间部分时,它默认为 midnight 即 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