Tengo una fecha con el año 19, pero en realidad sale como 0019 en lugar de 2009. ORDER_DATE es un campo de fecha.

Entonces cuando lo hago

select ORDER_DATE, TO_CHAR(ORDER_DATE,'YYYY/MM/DD') from table abc

Entiendo:

30-JUN-19   0019/06/30
30-APR-19   0019/04/30
31-DEC-21   2021/12/31
23-JAN-19   2019/01/23

¿Hay alguna forma de cambiar el año 0019 a 2019?

Lo intenté:

SELECT case when extract(year from ORDER_DATE) = 19 
    then add_months (ORDER_DATE,24000) 
    else ORDER_DATE 
end as fixed_date 
from abc

Pero no estoy segura si esa es la mejor manera.

Gracias

1
seth 28 may. 2020 a las 05:13

3 respuestas

La mejor respuesta

Puedes probarlo.

select ORDER_DATE, REPLACE(TO_CHAR(ORDER_DATE,'YYYY/MM/DD'), '0019', '2019') from table abc
1
Hung Le 28 may. 2020 a las 02:32

Para consultar con fechas corregidas:

select order_date
     , case when to_number(to_char(order_date,'CC')) = 1
           then order_date + numtoyminterval(2000, 'YEAR')
           else order_date
       end as fixed_date 
from   demo;

Para arreglar los datos:

update demo
set    order_date = order_date + numtoyminterval(2000, 'YEAR')
where  order_date < date '1000-01-01';

Esto maneja años distintos de 0019, y también conserva cualquier componente de tiempo.

0
William Robertson 28 may. 2020 a las 07:50

Parece que tus fechas de 2019 están realmente mal. Debe realmente investigar qué causó que estos datos incorrectos ingresen a su base de datos y solucionarlo.

Su enfoque para cambiar las fechas sobre la marcha en la consulta está bien para 2019. Sugeriría dar un paso más y corregir sus datos, por lo que no necesita preocuparse por eso más adelante (suponiendo que haya encontrado y arreglado el causa de los malos valores). Aquí hay un enfoque genérico que agrega 2000 años a cualquier fecha anterior al año 100:

update mytable
set order_date = add_months(order_date, 12 * 2000)
where extract(year from mytable) < 100

Es posible que desee adaptar el límite a su problema real.

1
GMB 28 may. 2020 a las 02:25