Regex Oracle中日期的正则表达式

Regex Oracle中日期的正则表达式,regex,oracle,Regex,Oracle,我有各种可能排列的日期格式。年月日,年月日,年月日,年月日,年月日 现在,我需要在Oracle DB中编写一个正则表达式,以便按原样从1列中获取不同的日期格式。我不确定您的目标是什么,但由于月份总是在前,后面紧跟着日期,因此无论输入格式如何,您都可以使用以下表达式获取日期: select to_date( column, 'mm/dd/yyyy') from ... 我不确定您的目标是什么,但由于月份总是第一个,然后是天,因此无论输入格式如何,您都可以使用以下表达式获取日期: select

我有各种可能排列的日期格式。年月日,年月日,年月日,年月日,年月日


现在,我需要在Oracle DB中编写一个正则表达式,以便按原样从1列中获取不同的日期格式。我不确定您的目标是什么,但由于月份总是在前,后面紧跟着日期,因此无论输入格式如何,您都可以使用以下表达式获取日期:

 select to_date( column, 'mm/dd/yyyy') from ...

我不确定您的目标是什么,但由于月份总是第一个,然后是天,因此无论输入格式如何,您都可以使用以下表达式获取日期:

 select to_date( column, 'mm/dd/yyyy') from ...

您可以选择符合以下条件的所有记录:

where [column_value] != to_char(to_date([column_value],'MM/DD/YYYY'),'MM/DD/YYYY')

您可以选择符合以下条件的所有记录:

where [column_value] != to_char(to_date([column_value],'MM/DD/YYYY'),'MM/DD/YYYY')
试试这个:

with t(date_col) as (
select '01/01/2014' from dual
union all
select '1/2/2014' from dual
union all
select '01/3/2014' from dual
union all
select '1/04/2014' from dual
union all
select '11/1/14' from dual)
select date_col,
       case
         when regexp_instr(date_col, '^\d/\d/\d{4}$') = 1 then
          'd/m/yyyy'
         when regexp_instr(date_col, '^\d{2}/\d/\d{4}$') = 1 then
          'dd/m/yyyy'
         when regexp_instr(date_col, '^\d/\d{2}/\d{4}$') = 1 then
          'd/mm/yyyy'
         when regexp_instr(date_col, '^\d{2}/\d{2}/\d{4}$') = 1 then
          'dd/mm/yyyy'
         else
          'Unknown format'
       end date_format
  from t;

DATE_COL   DATE_FORMAT
---------- --------------
01/01/2014 dd/mm/yyyy
1/2/2014   d/m/yyyy
01/3/2014  dd/m/yyyy
1/04/2014  d/mm/yyyy
11/1/14    Unknown format
试试这个:

with t(date_col) as (
select '01/01/2014' from dual
union all
select '1/2/2014' from dual
union all
select '01/3/2014' from dual
union all
select '1/04/2014' from dual
union all
select '11/1/14' from dual)
select date_col,
       case
         when regexp_instr(date_col, '^\d/\d/\d{4}$') = 1 then
          'd/m/yyyy'
         when regexp_instr(date_col, '^\d{2}/\d/\d{4}$') = 1 then
          'dd/m/yyyy'
         when regexp_instr(date_col, '^\d/\d{2}/\d{4}$') = 1 then
          'd/mm/yyyy'
         when regexp_instr(date_col, '^\d{2}/\d{2}/\d{4}$') = 1 then
          'dd/mm/yyyy'
         else
          'Unknown format'
       end date_format
  from t;

DATE_COL   DATE_FORMAT
---------- --------------
01/01/2014 dd/mm/yyyy
1/2/2014   d/m/yyyy
01/3/2014  dd/m/yyyy
1/04/2014  d/mm/yyyy
11/1/14    Unknown format


那一栏里除了日期还有其他数据吗?请发布样本数据和所需输出。不要试图绕过错误的输入数据。如果可能的话,修复输入过程(通过教育您的用户,使用DATE而不是VARCHAR2作为列类型)。不,我只有上述格式的日期。样本数据为2006年1月1日、2017年1月1日、2012年5月1日,该列的数据类型是?不使用
VARCHAR
数据类型表示日期的另一个原因。该列中是否有除日期以外的其他数据?请发布样本数据和所需输出。不要试图绕过错误的输入数据。如果可能的话,修复输入过程(通过教育您的用户,使用DATE而不是VARCHAR2作为列类型)。不,我只有上述格式的日期。示例数据是2006年1月1日、2017年1月1日、2012年1月5日,该列的数据类型是另一个不使用
VARCHAR
datatype作为日期的原因。目标是在列中找到不同的日期格式,每种格式我都有数千条记录。我想重点是MM/DD/YYYY、M/D/yyyyy、MM/D/yyyyy,M/DD/YYYY不被视为不同的格式。验证的目的是检查所有不以这种方式出现的日期MM/DD/YYYY,当日期与M/DD/YYYY一起传递时,这是一个错误。对于ex:01/01/2011,错误的是1/01/2011。目标是在列中找到不同的日期格式,每种格式我都有数千条记录。我想重点是MM/DD/YYYY、M/D/yyyyy、MM/D/yyyyy、M/DD/yyyyy不被视为不同的格式。验证是检查所有不以这种方式出现的日期MM/DD/yyyyyy,用M/DD/YYYY传递日期是一个错误。例如:2011年1月1日,错误的是2011年1月1日。@akram很高兴它起了作用。请将问题标记为已回答。@akram按答案左侧的复选标记按钮。您可能还需要在帮助中心阅读。@akram很高兴它起到了帮助作用。请将问题标记为已回答。@akram按答案左侧的复选标记按钮。您可能还需要在帮助中心阅读。