在oracle DB中格式化各种日期格式为single

Format various date formats to single in oracle DB

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

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

  1. 2017 年 6 月 14 日
  2. 2017 年 9 月 15 日
  3. 2017 年 5 月
  4. 2017 年 2 月 1 日
  5. 空值

我必须在数据库视图中显示此字段并将它们全部转换为日期格式。

我尝试过的各种选项都给我这样的错误: "a non-numeric character was found where a numeric was expected" 或 "invalid number"

我还发现 "day" 字段在一些日期中丢失,例如 'May 2017' 需要设置为 01-May-2017。

您是否建议继续使用类似于下面从路径粘贴的解决方案: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;

也许您可以尝试将共享相同格式的数据分组。 REGEXP_LIKE 在这种情况下可能会派上用场。它可能没问题,因为它可以让您轻松 "upgrade" 它,只要您找到人们用来输入数据的另一种格式。

下面的例子肯定不是很理想,因为有错别字;几个月可能是 "Ferubrary" 或 "Mya";天可能是 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>