sql >> Base de Datos >  >> RDS >> Oracle

ORA-01847 el día del mes debe estar entre el 1 y el último día del mes, pero los datos están bien

Esta es su consulta con el where cláusula:

select value1, to_date(value1,'DD.MM.YYYY') 
from variableindex 
where value1 is not null and
      value1 <> '0' and
      creation_time_ > to_timestamp('20140307', 'YYYYMMDD') and
      to_date(value1 'DD.MM.YYYY') < to_date('20140301', 'YYYYMMDD')
order by 2;

Oracle no garantiza el orden de procesamiento de las cláusulas en el where . Entonces, value <> '0' no se garantiza que se ejecute antes de la última condición. Esto pasa a ser un gran problema en SQL Server. Una solución es usar un case declaración:

select value1,to_date(value1, 'DD.MM.YYYY') 
from variableindex 
where value1 is not null and
      value1 <> '0' and
      creation_time_ > to_timestamp('20140307', 'YYYYMMDD') and
      (case when value <> '0' then to_date(value1, 'DD.MM.YYYY') end) <
          to_date('20140301', 'YYYYMMDD')
order by 2;

Bastante feo, pero podría resolver tu problema.