我有一个table1(DueDate varchar2(20)).它有数千个不同格式的日期数据和一些不良数据,如字符.
例如.
YYYYMMDD,
MM/DD/YYYY,
MM-DD-YYYY,
M/D/YYYY,
'ABCD'
YYYYMMD,
YYYYMDD,
Run Code Online (Sandbox Code Playgroud)
现在我必须得到逾期一周的日期.我怎么做?
谢谢您的帮助.
这是在字符字段中存储日期信息是如此糟糕的原因之一.
最简单的选择是创建一个函数,尝试使用您拥有的任何优先级顺序(即01020 2003年1月2日或2001年2月3日或其他)的格式将字符串转换为日期,并捕获异常.就像是
CREATE OR REPLACE FUNCTION my_to_date( p_str IN VARCHAR2 )
RETURN DATE
IS
l_date DATE;
BEGIN
l_date := to_date( p_str, 'YYYYMMDD' );
RETURN l_date;
EXCEPTION
WHEN others THEN
BEGIN
l_date := to_date( p_str, 'MM/DD/YYYY' );
RETURN l_date;
EXCEPTION
WHEN others
THEN
RETURN null;
END;
END;
Run Code Online (Sandbox Code Playgroud)
有点像
SQL> CREATE OR REPLACE FUNCTION my_to_date( p_str IN VARCHAR2 )
2 RETURN DATE
3 IS
4 l_date DATE;
5 BEGIN
6 l_date := to_date( p_str, 'YYYYMMDD' );
7 RETURN l_date;
8 EXCEPTION
9 WHEN others THEN
10 BEGIN
11 l_date := to_date( p_str, 'MM/DD/YYYY' );
12 RETURN l_date;
13 EXCEPTION
14 WHEN others
15 THEN
16 RETURN null;
17 END;
18 END;
19 /
Function created.
SQL> select my_to_date( '19000101' ) from dual;
MY_TO_DAT
---------
01-JAN-00
SQL> ed
Wrote file afiedt.buf
1* select my_to_date( '01/02/2005' ) from dual
SQL> /
MY_TO_DAT
---------
02-JAN-05
Run Code Online (Sandbox Code Playgroud)
当然,您必须在代码中编写完整的有效日期格式代码,我只是处理列表中的前两个.
| 归档时间: |
|
| 查看次数: |
795 次 |
| 最近记录: |