我们有一个旧表,其中日期字段以多种格式存储在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中。所以现在我们需要将日期转换为日期(从一种格式转换为另一种格式并返回日期)
提前致谢!
答案 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 ...
选择最适合您业务需求的产品,但如果我是您,我肯定会选择将数据存储在不同列中的第一个选项,然后删除旧列。