从oracle中的varchar列中删除非日期值

时间:2015-07-10 13:28:41

标签: sql oracle plsql

在一个名为customers的表中,我有一个varchar2列(financial_month) 该列应该是一个日期列,但由于它是一个varchar2列,并且由于编码错误,因此有许多数据不是日期格式。
例如:0.15已存储在一个记录和许多其他错误条目中。

现在我想消除所有错误的条目 我应该遵循什么流程? 我毫不知道。我也无法识别错误的条目。我唯一知道的是有超过1000个错误的条目。

如何从此列中删除所有错误的条目?

2 个答案:

答案 0 :(得分:0)

您可以使用类似

的内容
WHERE REGEXP_LIKE(financial_month, '^[0-9]{2}[.][0-9]{2}[.][0-9]{4}$')

查找日期值为
的行 (这是日期格式DD.MM.YYYY或MM.DD.YYYY)

或更精确的正则表达式

'^[0-3][0-9][.][0-1][0-9][.](19|20)[0-9]{2}$' 

表示DD.MM.YYYY格式。

答案 1 :(得分:0)

假设"财政月份的格式"必须是MM / YYYY:

CREATE TABLE fm_t (fm VARCHAR2(30));

INSERT INTO fm_t VALUES ('01/2015');
INSERT INTO fm_t VALUES ('0.5');
INSERT INTO fm_t VALUES ('whatsever');
INSERT INTO fm_t VALUES ('02/2015');
SELECT * FROM fm_t;

CREATE OR REPLACE FUNCTION fm_f(fm IN VARCHAR2) RETURN INTEGER IS
    d DATE;
BEGIN
    d := TO_DATE(fm, 'FMMM/YYYY');
    RETURN 1;
    EXCEPTION WHEN OTHERS THEN
        RETURN 0;
END;
/

DELETE fm_t WHERE fm_f(fm) <> 1;
SELECT * FROM fm_t;

DROP FUNCTION fm_f;
DROP TABLE fm_t;