【问题标题】:Regular expression on Dates in OracleOracle中日期的正则表达式
【发布时间】:2014-04-16 09:16:55
【问题描述】:

我有所有可能排列的日期格式。 MM/DD/YYYY, M/D/YYYY, MM/D/YYYY, M/DD/YYYY

现在我需要在 Oracle DB 中编写一个正则表达式,以按原样从 1 列中获取不同的日期格式

【问题讨论】:

  • 那一栏除了日期还有其他数据吗?请发布示例数据和所需的输出。
  • 不要试图解决错误的输入数据。如果可能,修复输入过程(通过教育您的用户,使用 DATE 而不是 VARCHAR2 作为您的列类型)。
  • 不,我只有上述格式的日期。样本数据为 1/01/2006、01/01/2017、01/05/2012
  • 那列的数据类型是?
  • 另一个日期使用VARCHAR数据类型的原因。

标签: regex oracle


【解决方案1】:

试试这个:

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

【讨论】:

  • @akram 很高兴它有帮助。请将问题标记为已回答。
  • @akram 按答案左侧的复选标记按钮。您可能还需要阅读帮助中心中的this topic
【解决方案2】:

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

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

【讨论】:

  • 目标是在列中找到不同的日期格式,每种格式我都有数千条记录。
  • 我认为重点是 MM/DD/YYYY、M/D/YYYY、MM/D/YYYY、M/DD/YYYY 不被视为不同的格式。
  • 验证是检查所有不是以这种方式出现的日期 MM/DD/YYYY,当日期以 M/DD/YYYY 传递时,这是一个错误。例如:2011 年 1 月 1 日,错误的是 2011 年 1 月 1 日。
【解决方案3】:

您可以选择满足以下条件的所有记录:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2020-08-11
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多