【问题标题】:How to extract date of particular format in Oracle? [duplicate]如何在Oracle中提取特定格式的日期? [复制]
【发布时间】:2018-03-07 23:45:45
【问题描述】:

我有这张表,其中 VARCHAR2(128 CHAR) 字段的格式可以是 2018-01-01 00:00:0001/01/2018 00:00:0001-JAN-2018 00:00:00

如何单独提取具有 2016-01-01 00:00:0001-JAN-2018 00:00:00 格式的 VARCHAR2(128 CHAR) 字段的记录?

【问题讨论】:

  • 为什么要将日期值存储在VARCHAR 列中?
  • 真的吗?甲骨文版本 1.5.5。不存在,它是一个从未向公众发布的实验性数据库管理系统。第一个公开的 Oracle 版本是 Oracle V2 - 1979 年发布!
  • 我想@KaushikNayak 想知道 oracle DB 的版本。您可以使用 SELECT * FROM V$VERSION 获得它
  • Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
  • 我想知道版本,因为在 Oracle 12.2 中有一个方便的 TO_DATE 函数和 DEFAULT ON CONVERSION ERROR 子句:oracle-base.com/articles/12c/… 可以简化解决方案。

标签: oracle oracle12c


【解决方案1】:

在 varchar 中存储日期不好。但就像这样,我建议将字符串转换为日期,然后再次转换回字符串。像这样:

declare
  d date;
begin
  begin
    d:=to_date('01.01.2011 23:49:00','dd/mm/yyyy hh24:mi:ss');
  exception
    when others then
      begin
        d:=to_date('01.01.2011 23:49:00','dd.mm.yyyy hh24:mi:ss');
      exception
        when others then
          begin
            d:=to_date('01.01.2011 23:49:00','dd-mm-yyyy hh24:mi:ss');
          exception
            when others then
              -- any more date format strings?
              null;
          end;
      end;
  end;
  dbms_output.put_line(to_char(d,'dd-mm-yyyy hh24:mi:ss'));
end;
/

【讨论】:

    【解决方案2】:

    创建一个将日期字符串转换为日期的函数:

    create or replace function date_from_string(str varchar2, fmt varchar2) return date is
        v date;
    begin
        return to_date(str,fmt);
    exception when others
        then return null;
    end;
    

    并查询表,例如:

    with t as (
    select case when regexp_like(field, '^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d$') 
                  then 'YYYY-MM-DD HH24:MI:SS'
                when regexp_like(field, '^\d\d-[a-zA-Z]{3}-\d{4} \d\d:\d\d:\d\d$') 
                  then 'DD-MON-YYYY HH24:MI:SS'
                 end fmt, t.*
    from "TABLE" t
    )
    select t.*, date_from_string(t.field, t.fmt) "DATE" from t
    where date_from_string(t.field, t.fmt) is not null;
    

    通过这种方式,您可以轻松检查给定记录中的日期是否正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多