【问题标题】:changing 0019 year to 2019将 0019 年更改为 2019
【发布时间】:2020-09-15 05:55:50
【问题描述】:

我的日期是 19 年,但实际上是 0019 而不是 2009。ORDER_DATE 是一个日期字段。

所以当我这样做时

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

我明白了:

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

有办法把0019年改成2019年吗?

我试过了:

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

但不确定这是否是最好的方法。

谢谢

【问题讨论】:

    标签: sql oracle date select


    【解决方案1】:

    查询更正日期:

    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;
    

    修复数据:

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

    这会处理 0019 以外的年份,并且还会保留任何时间组件。

    【讨论】:

      【解决方案2】:

      你可以试试。

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

      【讨论】:

      • 这将生成YYYY/MM/DD 格式的字符串,而不是日期。
      【解决方案3】:

      看来您的 2019 年日期实际上是错误的。您应该真的调查是什么导致这些不良数据进入您的数据库并修复它。

      您在查询中动态更改日期的方法适用于 2019 年。我建议您更进一步并实际修复您的数据,因此您以后无需担心(假设您发现并修复了错误值的原因)。这是一种通用方法,可将 2000 年添加到 100 年之前的任何日期:

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

      您可能希望根据实际问题调整边界。

      【讨论】:

      • 嗨,谢谢,是的,更新数据是最理想的,但如果我想修复它,最简单的解决方案是什么?正在尝试类似 if year is 19 then 2019 然后添加月份和日期但是当我尝试它抱怨错误的数据类型时,我认为 char 是文本并且我可以将 '2019' 连接到 TO_CHAR(ORDER_DATE,' MM-DD')?
      猜你喜欢
      • 2020-03-17
      • 2020-02-07
      • 2023-02-04
      • 2020-01-25
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多