将VARCHAR2转换为Date,然后再将其转换为特定的Date格式

时间:2013-10-21 09:54:26

标签: sql oracle date-conversion

我们有一个旧表,其中日期字段以多种格式存储在VARCHAR2中。现在我们计划:

1)将这些数据存储在具有适当日期字段的视图中。

2)同样以一致的格式存储这些格式,如MM / DD / YYYY。

这是为#1做的:创建一个函数,以便它可以解析VARCHAR2并将其转换为DATE,用于不同的格式,如:

IF dataTobeConverted IS NOT NULL
        THEN
            IF substr(dataTobeConverted,3,1) = '-'
             THEN retDate:= TO_DATE(dataTobeConverted,'DD-MON-YYYY');
            END IF;

            IF substr(dataTobeConverted,3,1) = '/'
             THEN retDate:= TO_DATE(dataTobeConverted,'MM/DD/YYYY');
            END IF;
        END IF;

RETURN retDate;

对于#2,我们仍然需要将上面的这2个日期转换为MM / DD / YYYY,其中一个已经采用这种格式,所以我们需要在第一个条件下转换另一个('DD-MON-YYYY')在视图的日期字段中存储在MM / DD / YYYY中。所以现在我们需要将日期转换为日期(从一种格式转换为另一种格式并返回日期)

提前致谢!

4 个答案:

答案 0 :(得分:1)

  

将这些数据存储在视图中

View不存储实际数据 - 它只是一个存储的select语句,仅此而已。

  

首先将条件存储在视图的日期字段中的MM / DD / YYYY中

使用特定格式将表示日期的字符串文字转换为DATE数据类型的值时,并不意味着Oracle以该格式存储转换后的值。提供格式掩码作为TO_DATE()函数的第二个参数,您只需通知oracle为DATE数据类型赋予适当的内部表示。日期不会以任何特定格式存储。 这意味着,一旦您将字符串文字转换为DATE数据类型的值,您只需使用to_char()函数以您想要的任何格式显示该日期或依赖于日期表示格式掩码集nls_date_format

SQL> with t1(col) as(
  2    select to_date('21-10-2013', 'dd-mm-yyyy') from dual union all
  3    select to_date('21/10/2013', 'dd/mm/yyyy') from dual union all
  4    select to_date('21.10.2013', 'dd.mm.yyyy') from dual
  5  )
  6  select to_char(col, 'dd/mm/yyyy') as res
  7    from t1
  8  ;


RES
----------
21/10/2013
21/10/2013
21/10/2013

答案 1 :(得分:0)

如果我理解正确,您不必再次转换它 - 如果您将一个字符串转换为DATE数据类型,那么它将以相同的方式存储,无论原始如何日期,例如,VARCHAR2数据类型,看起来像。

向用户显示数据的方式取决于您使用的TO_CHAR函数指定的会话参数或模型格式。但是,在内部,DATE存储时没有格式模型。

答案 2 :(得分:0)

正如Przemyslaw Kruglej正确评论的那样,你不应该在varchar2中存储日期。这说:

alter table oldtable add new_date date;

update oldtable set new_date =
  case
    when substr(old_date,3,1) = '-' then to_date(old_date,'DD-MON-YYYY')
    when substr(old_date,3,1) = '/' then to_date(old_date,'MM/DD/YYYY')
    else null
  end
where old_date is not null;

检查每个日期是否被识别:

select * from oldtable where old_date is not null and new_date is null;

最后:

alter table oldtable drop old_date;

答案 3 :(得分:0)

也许您可以执行以下操作:

UPDATE myTable
   SET newDateColumn = CASE
                          WHEN substr(oldDateColumn,3,1) = '-'
                            THEN TO_DATE (oldDateColumn, 'DD-MON-YYYY')
                          WHEN substr(oldDateColumn,3,1) = '/'
                            THEN TO_DATE (oldDateColumn, 'MM/DD/YYYY')
                          WHEN substr(oldDateColumn,3,1) = '.'
                            THEN TO_DATE (oldDateColumn, 'DD.MM.YYYY')
                          ELSE TO_DATE (oldDateColumn)
                       END;

这会将VARCHAR2列转换为DATE列,并将值存储到新列中(如果已创建它)。

或者,在您的视图中,只需按如下方式编写select语句:

SELECT ...
       CASE
          WHEN substr(oldDateColumn,3,1) = '-'
            THEN TO_DATE (oldDateColumn, 'DD-MON-YYYY')
          WHEN substr(oldDateColumn,3,1) = '/'
            THEN TO_DATE (oldDateColumn, 'MM/DD/YYYY')
          WHEN substr(oldDateColumn,3,1) = '.'
            THEN TO_DATE (oldDateColumn, 'DD.MM.YYYY')
          ELSE TO_DATE (oldDateColumn)
       END AS column_alias
  FROM ...
 WHERE ...

选择最适合您业务需求的产品,但如果我是您,我肯定会选择将数据存储在不同列中的第一个选项,然后删除旧列。