ошибка при фильтрации оператора выбора по дате - PullRequest
0 голосов
/ 06 августа 2020

Я получил сценарий от коллеги по работе для запуска при проверке пакетов, однако сценарий работает на его ноутбуке, но как только я запускаю его на своем устройстве, я получаю сообщение об ошибке. Я не знаю, могут ли это быть разрешения, поскольку это единственное различие между нашими настройками.

сценарий состоит в том, чтобы выбрать определенные столбцы, преобразовать формат даты с to_char для определенного c имени пакета, а затем отфильтровать для спецификаций c дата и время. вот пример кода:

select batch_name, NO_OF_ITEMS, NUMBER_OF_ERRORS, to_char(RUN_START_DATE,'DD-MON-YYYY HH24:MI') EXECUTION_START, to_char(RUN_END_DATE,'DD-MON-YYYY HH24:MI') EXECUTION_END,
to_char(START_DATE,'DD-MON-YYYY HH24:MI') START_DATE, to_char(END_DATE,'DD-MON-YYYY HH24:MI') END_DATE, NOTES from bat_log
where BATCH_NAME in (
'SJ63R_03'
) 
and RUN_START_DATE between '04-Aug-2020 07:00' AND '05-Aug-2020 07:00'
order by run_start_date desc;

ошибка, которую я получаю:

ORA-01830: date format picture ends before converting entire input string
01830. 00000 -  "date format picture ends before converting entire input string"
*Cause:    
*Action:

когда я удаляю время 07:00 из RUN_START_DATE between '04-Aug-2020 07:00' AND '05-Aug-2020 07:00', скрипт работает отлично, но, очевидно, не фильтрует для сроков.

любые предложения приветствуются.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Да, между вашими двумя настройками что-то отличается. Это значение NLS_DATE_FORMAT.

Ваш запрос зависит от неявного TO_DATE () для преобразования строк '04 -Aug-2020 07:00 'AND '05 -Aug-2020 07:00 'из строк в DATE, который является внутренним двоичным типом данных. Поскольку вы полагаетесь на неявное преобразование, вы также полагаетесь на базовое значение NLS_DATE_FORMAT для соответствия строкам, которые вы предоставляете. Вот почему я всегда, всегда, всегда использую to_date () и включаю правильную маску формата:

RUN_START_DATE between to_date('04-Aug-2020 07:00','dd-Mon-yyyy hh24:mi:ss') AND to_date('05-Aug-2020 07:00','dd-Mon-yyyy hh24:mi:ss')

Для получения дополнительной информации см. https://edstevensdba.wordpress.com/2011/04/07/nls_date_format/

1 голос
/ 06 августа 2020

Я попытался немного воспроизвести ваш сценарий

SQL> create table t ( c1 date , c2 date ) ;

Table created.

SQL> insert into t values ( to_date('01/08/2020 11:00:00','DD/MM/YYYY HH24:MI:SS') , to_date('01/08/2020 17:00:00','DD/MM/YYYY HH24:MI:SS') ) ;

1 row created.

SQL> insert into t values ( to_date('01/09/2020 11:00:00','DD/MM/YYYY HH24:MI:SS') , to_date('01/09/2020 17:00:00','DD/MM/YYYY HH24:MI:SS') ) ;

1 row created.

SQL> select * from t ;

C1        C2
--------- ---------
01-AUG-20 01-AUG-20
01-SEP-20 01-SEP-20

SQL> select c1 , c2 from t where to_char(c1,'DD-MON-YYYY HH24:MI') between '02-AUG-2020 08:00' and '02-SEP-2020 08:00' ;

no rows selected

SQL> select c1 , c2 , to_char(c1,'DD-MON-YYYY HH24:MI') as result from t ;

C1        C2        RESULT
--------- --------- --------------------------
01-AUG-20 01-AUG-20 01-AUG-2020 11:00
01-SEP-20 01-SEP-20 01-SEP-2020 11:00

SQL> select c1 , c2 from t where to_char(c1,'DD-MON-YYYY HH24:MI') between to_date('02-AUG-2020 08:00','DD-MON-YYYY HH24:MI')
  2  and to_date('02-SEP-2020 08:00','DD-MON-YYYY HH24:MI') ;
select c1 , c2 from t where to_char(c1,'DD-MON-YYYY HH24:MI') between to_date('02-AUG-2020 08:00','DD-MON-YYYY HH24:MI')
                            *
ERROR at line 1:
ORA-01830: date format picture ends before converting entire input string


SQL> alter session set nls_date_format='DD-MON-YYYY HH24:MI' ;

Session altered.

SQL> select c1 , c2 from t where c1 between to_date('02-AUG-2020 08:00','DD-MON-YYYY HH24:MI')
and to_date('02-SEP-2020 08:00','DD-MON-YYYY HH24:MI') ;  2

C1                C2
----------------- -----------------
01-SEP-2020 11:00 01-SEP-2020 17:00

SQL>

Если исходные поля являются датами, вы можете изменить настройки даты NLS, чтобы они работали, а также примените to_date к строкам, которые вы хотите сравнить как даты

Обновить

Я удаляю to_char, чтобы избежать неявного преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...