2015-11-18 4 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

Почтовый индекс из 'fnd_date.canonical_to_date'. Ошибка связана с тем, что вы в зависимости от вашего локального формата даты ** NLS **, который отличается от того, что вы используете. вы всегда должны явно предоставлять маску формата ** **. –

+0

Не передавайте даты как строки. Используйте правильные переменные 'date'. Тогда вам также не нужно, чтобы обходной путь использовал вашу собственную функцию для преобразования строки в дату. –

ответ

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 может быть неудачной для таких литералов даты при преобразовании в 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 с DATE имеет как элементы даты и времени. Когда вы не укажете временную часть, по умолчанию она равна полночь i.e. 00:00:00.

Например, добавьте Interval '86399' ВТОРОЙ:

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

Не работает не стандартная ошибка оракула. Вам нужно отредактировать свой вопрос и опубликовать сообщение об ошибке. Почему он работает для одного параметра, а не другого? Сравните и посмотрите, что другое. Для другого параметра, почему вам нужно добавить интервал? Вам нужно, чтобы он начинался со временем '00: 00: 00'. Оставьте часть даты, она будет иметь временную часть как' 00: 00: 00'. –

+0

Добавлено обновление. Пожалуйста, отметьте ответ как принято, помогите другим тоже! –