将MDDYYYY或MDYYYY格式字符串插入日期列

时间:2019-05-17 15:03:43

标签: sql oracle

我正在从业务团队获取.csv文件中的日期。有时他们以MDDYYYY格式发送它,而我已经使用LPAD和TO_DATE在DATE列中插入此字符串格式。但是,当文件的5月3日为532019时,它失败了。请问如何在日期列中插入此字符串。

INSERT INTO USB.BAS2_AGENCY_TO_RISKRATING_TRAN
(AS_OF_DATE)
VALUES
(TO_DATE(LPAD(5032019,8,0),'MMDDYYYY')); 

这适用于MDDYYYY源值,但不适用于MDYYYY。我需要在两种情况下都可以使用的东西。

2 个答案:

答案 0 :(得分:2)

这应该在前端进行纠正。我建议您让您的业务团队以一致的格式发送日期。愚蠢的是必须要处理的日期是532019、5032019或05032019-全部代表2019年5月3日。

答案 1 :(得分:1)

没有自动的方法可以做到这一点,也没有神奇的日期格式模型可以应对。您必须根据其长度对源编号(作为字符串)进行更多的操作。

演示,假设总是6到8位数字:

-- CTE for some sample numbers
with cte (num) as (
            select   532019 from dual
  union all select  5032019 from dual
  union all select 05032019 from dual
  union all select 12032018 from dual
  union all select  1232018 from dual
  union all select  1112018 from dual
)
select num,
  case when length(num) = 6 then '0' || substr(num, 1, 1)
                              || '0' || substr(num, 2, 5)
       else to_char(num, 'FM00000000')
  end as full_num,
  to_date(case when length(num) = 6 then '0' || substr(num, 1, 1)
                                             || '0' || substr(num, 2, 5)
               else to_char(num, 'FM00000000')
          end, 'MMDDYYYY') as full_date
from cte;

       NUM FULL_NUM  FULL_DATE 
---------- --------- ----------
    532019 05032019  2019-05-03
   5032019 05032019  2019-05-03
   5032019 05032019  2019-05-03
  12032018 12032018  2018-12-03
   1232018 01232018  2018-01-23
   1112018 01112018  2018-01-11

但是,这确实没有必要;并注意模棱两可,尤其是最后一行-是否应该将1112018扩展为01112018或11012018?您无法知道。

我建议您与发送此数据的人联系,并让他们在结束时解决问题,最好始终传递明确的零填充8位数字-甚至更好地传递明确的ANSI日期文字而不是数字。