我在oracle数据库中有一个数据类型为varchar
的列,此列接受不同类型的数据,如下所示
03/01/2012
01 JANUARY 2012
1 FEBRUARY 2013
13-JAN-2012
03/01/2012 MM-ss
现在我想将单一格式转换为'DD / MM / YY或其他任何一种标准格式
临屋
答案 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