2015-11-18 71 views
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_ORDER_NUMBER=, P_FROM_CUSTOMER=} Calling XDO Data Engine... --SQLException java.sql.SQLDataException: ORA-01861: literal does not match format string

+0

邮编。错误是由于您取决于您​​的本地** NLS **日期格式,这与您使用的日期格式不同。您必须始终明确提供**格式掩码**。 –

+0

不要将日期作为字符串传递。使用适当的'日期'变量。然后,您也不需要使用自己的函数将字符串转换为日期的解决方法。 –

回答

1

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

另外,您不应该依赖于您的客户端的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 

UPDATE

对于您只需要启动时间的第一部分,你不必时间部分添加为00:00:00日期既有日期和时间元素。如果您未提及时间部分,则默认为午夜00:00:00

例如,添加INTERVAL '86399' SECOND:fnd_date.canonical_to_date`的`

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 
+0

删除了fnd_date.canonical_to_date函数。现在+间隔'86399'秒正在为一个参数工作,但不能为另一个工作。 –

+0

不工作不是oracle标准错误。您需要编辑您的问题并发布错误。为什么它会为一个参数而不是另一个参数工作?比较看看有什么不同。对于其他参数,为什么你甚至需要添加一个间隔?您需要在时间00:00:00开始,因此保留日期部分,其时间部分为00:00:00。 –

+0

添加了更新。请将答案标记为已接受,也会帮助其他人! –