在oracle DB中将各种日期格式格式化为单一格式

时间:2018-01-26 21:42:00

标签: database oracle datetime date-conversion

我在数据库中有一个名为“ExamDate”的字符串字段,其中包含日期。最初,应用程序没有前端验证,数据库保存为字符串,因此用户可以以任何格式输入日期。

所需格式为DD-MMM-YYYY,但目前该字段包含所有格式的值,例如:

  1. 14君-2017
  2. 2017年9月15日
  3. 2017年5月
  4. 2017年2月1日
  5. NULL值
  6. 我必须在数据库视图中显示此字段,并将所有字段转换为日期格式。

    我试过的各种选项给我的错误如下: “找到了数字所在的非数字字符”或 “无效号码”

    我也意识到“日期”字段在几个日期中缺失,例如“2017年5月”,需要设置为2017年5月1日。

    您是否建议使用与路径下方粘贴的解决方案类似的解决方案:How to update dates stored as varying character formats (PL/SQL)?

    SELECT ANTICIPATEDSPUD
          ,DECODE (
               INSTR (ANTICIPATEDSPUD, '-')
              ,5, TO_DATE (ANTICIPATEDSPUD, 'YYYY-MM-DD')
              ,3, TO_DATE (ANTICIPATEDSPUD, 'MM-DD-YYYY')
              ,DECODE (LENGTH (ANTICIPATEDSPUD)
                      ,8, TO_DATE (ANTICIPATEDSPUD, 'MM/DD/YY')
                      ,10, TO_DATE (ANTICIPATEDSPUD, 'MM/DD/YYYY')))
      FROM FSW_BASIC_WELL_INFO_VW;
    

1 个答案:

答案 0 :(得分:1)

也许您可以尝试对共享相同格式的数据进行分组。 REGEXP_LIKE在这种情况下可能会派上用场。它可能没问题,因为它允许你升级"一旦你发现人们用来输入数据的另一种格式,它就很容易了。

由于拼写错误,以下示例当​​然不是理想的;几个月可能是" Ferubrary"或者" Mya&#34 ;;天数可能是35天,13个月等等,因此您必须检查这些值是否有意义。

反正;看一看。我已将ID列仅用于排序目的。

SQL> alter session set nls_date_language = 'english';

Session altered.

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> with test (id, datum) as
  2  (select 1, '14-Jun-2017'      from dual union
  3   select 2, '9/15/2017'        from dual union
  4   select 3, 'May 2017'         from dual union
  5   select 4, 'February 1, 2017' from dual union
  6   select 5, null               from dual
  7  )
  8  select id, datum, to_date(datum, 'dd-mon-yyyy') result from test
  9    where regexp_like(datum, '[0-9]{1,2}-[[:alpha:]]{3}-[0-9]{4}')
 10  union
 11  select id, datum, to_date(datum, 'mm/dd/yyyy') from test
 12    where regexp_like(datum, '[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}')
 13  union
 14  select id, datum, to_date(datum, 'mon yyyy') from test
 15    where regexp_like(datum, '[[:alpha:]]{3} [0-9]{4}')
 16  union
 17  select id, datum, to_date(datum, 'month dd, yyyy') from test
 18    where regexp_like(datum, '\w+ [0-9]{1,2}, [0-9]{4}')
 19  order by id;

        ID DATUM            RESULT
---------- ---------------- ----------
         1 14-Jun-2017      14.06.2017
         2 9/15/2017        15.09.2017
         3 May 2017         01.05.2017
         4 February 1, 2017 01.02.2017

SQL>