将单日期格式转换为oracle数据类型

时间:2014-08-11 14:22:07

标签: sql plsql oracle11g

我在oracle数据库中有一个数据类型为varchar的列,此列接受不同类型的数据,如下所示

03/01/2012
01 JANUARY 2012
1  FEBRUARY 2013
13-JAN-2012
03/01/2012 MM-ss

现在我想将单一格式转换为'DD / MM / YY或其他任何一种标准格式

临屋

3 个答案:

答案 0 :(得分:1)

如上所述:

ALTER TABLE table_name MODIFY column_name DATE

添加新列:

ALTER TABLE table_name add (column_name DATE);

删除列:

ALTER TABLE table_name drop column col_name1;

答案 1 :(得分:0)

我建议采用有条不紊的方法。第1步是使用日期数据类型向表中添加新列。第2步是修改所有适用的应用程序,以便它们使用新列,而不是旧列。然后进行一系列更新查询。

update yourTable
set newDateColumn = to_date(oldVarcharColumn, 'mask')
where newDateColumn is null
and regexp_like (oldVarcharColumn, pattern)

最后删除oldVarcharColumn。

答案 2 :(得分:0)

正如其他人所建议的那样,如果您需要将日期值转换为表格中的单个数据类型,那么您可以按照分步方法进行操作。

由于现有列中有各种值的模式,因此可以将CASE语句与正则表达式(REGEXP_LIKE)结合使用来转换值,如下所示:

SELECT
  text_date, 
  CASE
    WHEN REGEXP_LIKE(text_date, '^\d{2}/\d{2}/\d{4}$') THEN to_date(text_date, 'MM/DD/YYYY')
    WHEN REGEXP_LIKE(text_date, '^\d{2} ([A-Z]|[a-z])+ \d{4}$') THEN to_date(text_date, 'DD MONTH YYYY')
    WHEN REGEXP_LIKE(text_date, '^\d{1}  ([A-Z]|[a-z])+ \d{4}$') THEN to_date(text_date, 'DD  MONTH YYYY')
    WHEN REGEXP_LIKE(text_date, '^\d{2}-([A-Z]|[a-z]){3}-\d{4}$') THEN to_date(text_date, 'DD-MON-YYYY')
    WHEN REGEXP_LIKE(text_date, '^\d{2}/\d{2}/\d{4} MM-ss$') THEN to_date(text_date, 'MM/DD/YYYY "MM-ss"')
    ELSE NULL
  END date_value
FROM text_dates
WHERE REGEXP_LIKE(text_date, '^\d{2}/\d{2}/\d{4}$')
OR REGEXP_LIKE(text_date, '^\d{2} ([A-Z]|[a-z])+ \d{4}$')
OR REGEXP_LIKE(text_date, '^\d{1}  ([A-Z]|[a-z])+ \d{4}$')
OR REGEXP_LIKE(text_date, '^\d{2}-([A-Z]|[a-z]){3}-\d{4}$')
OR REGEXP_LIKE(text_date, '^\d{2}/\d{2}/\d{4} MM-ss$')
ORDER BY text_date;

在上面的查询中,使用正则表达式检测每个模式。

参见 SQL Fiddle demo

<强>参考

REGEXP_LIKE Condition on Oracle® Database SQL Language Reference

Regular Expressions Cheat Sheet on PSOUG.ORG