1

我们有一个旧表,其中日期字段以多种格式存储在 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,我们仍然需要将上面的这两个日期转换为 MM/DD/YYYY,一个已经是这种格式,所以我们需要先转换另一个('DD-MON-YYYY'),如果要存储条件在视图的日期字段中的 MM/DD/YYYY 中。所以现在我们需要将日期转换为日期(从一种格式转换为另一种格式并返回一个日期)

提前致谢!

4

4 回答 4

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
于 2013-10-21T10:11:22.270 回答
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 ...

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

于 2013-10-21T11:45:30.150 回答
0

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

您向用户展示数据的方式取决于您使用(例如TO_CHAR函数)指定的会话参数或模型格式。但是,在内部, aDATE是在没有格式模型的情况下存储的。

于 2013-10-21T10:02:11.920 回答
0

正如 Przemyslaw Kruglej 正确指出的那样,您不应将日期存储在 varchar2 中。这说:

更改表 oldtable 添加 new_date 日期;

更新旧表集 new_date =
  案子
    当 substr(old_date,3,1) = '-' 然后 to_date(old_date,'DD-MON-YYYY')
    当 substr(old_date,3,1) = '/' 然后 to_date(old_date,'MM/DD/YYYY')
    否则为空
  结尾
其中 old_date 不为空;

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

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

最后:

alter table oldtable drop old_date;
于 2013-10-21T10:22:15.053 回答