SELECT TO_DATE(START_UTC_DAY, 'YYYYMMDD')
FROM SOURCETABLE
WHERE TO_DATE(START_UTC_DAY, 'YYYYMMDD') > SysDate - 7
TO_DATE()
в предложении WHERE
преобразует строковое значение с заданной моделью формата в тип DATE, прежде чем сравнивать его с другим значением DATE, что позволяет избежать неявного преобразования, вызвавшего проблему. См. Комментарии для лучшего варианта.
Сообщение здесь: избегайте неявных преобразований.
Объяснение:
Ошибка произошла из-за неявного преобразования в предложении WHERE, сравнение между два значения разных типов данных.
2.2.8.2 Неявное преобразование данных
- При сравнении значения символа со значением DATE, Oracle
преобразует символьные данные в DATE.
Во время преобразования значение символа / строкового литерала сравнивается с моделью формата даты, которая зависит от следующих настроек.
select name, value from v$parameter where name = 'nls_date_format';
В моей базе данных возвращается,
NAME VALUE
-------------------- --------------------
nls_date_format DD-MON-YY
Этот параметр можно изменить на уровне сеанса, что приведет к различным результатам, как показано ниже.
Ниже приведены некоторые тесты для дальнейшего объяснения поведения с помощью SQL Разработчик, использующий новый сеанс.
SQL> show parameter nls_date_format;
NAME TYPE VALUE
--------------- ------ ---------
nls_date_format string DD-MON-YY
SQL>
select str from
(select '20200412' as str from dual)
where str <> sysdate;
...
Error report -
ORA-01861: literal does not match format string
SQL>
alter session set nls_date_format = 'ddmmyyyy';
Session altered.
SQL>
SQL> show parameter nls_date_format;
NAME TYPE VALUE
--------------- ------ --------
nls_date_format string ddmmyyyy
SQL>
select str from
(select '20200412' as str from dual)
where str <> sysdate;
...
Error report -
ORA-01843: not a valid month
SQL>
alter session set nls_date_format = 'fxyyyy-mm-dd';
Session altered.
SQL>
SQL> show parameter nls_date_format;
NAME TYPE VALUE
--------------- ------ ------------
nls_date_format string fxyyyy-mm-dd
SQL>
select str from
(select '20200412' as str from dual)
where str <> sysdate;
...
Error report -
ORA-01861: literal does not match format string
SQL>
alter session set nls_date_format = 'yyyymmdd';
Session altered.
SQL>
SQL> show parameter nls_date_format;
NAME TYPE VALUE
--------------- ------ --------
nls_date_format string yyyymmdd
SQL>
select str from
(select '20200412' as str from dual)
where str <> sysdate;
STR
--------
20200412
Как показано выше, один и тот же запрос приводит к разным "результатам" в зависимости от настройки nls_date_format
.