我有一张表作为emp,其中一列是hiredate。我的雇用日期栏中有错误的日期。例如:30-feb-2018,31-apr-2018,31-jun-2018等。 这意味着这些日期不存在。我如何通过SQL查询找出错误的日期。
答案 0 :(得分:1)
创建一个小函数来测试有效日期:
CREATE OR REPLACE FUNCTION is_Valid_Date(
datestr VARCHAR2,
format VARCHAR2 DEFAULT 'DD/MM/YYYY'
) RETURN NUMBER DETERMINISTIC
AS
x DATE;
BEGIN
IF datestr IS NULL THEN
RETURN NULL;
END IF;
x := TO_DATE( datestr, format );
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
RETURN 0;
END;
/
然后在您的查询中调用它:
SELECT hiredate
FROM emp
WHERE is_Valid_Date( hiredate, 'DD-MON-YYYY' ) = 0;
答案 1 :(得分:1)
在Oracle 12.2及更高版本中,可以使用
DEFAULT .. ON CONVERSION ERROR
TO_DATE
选项
SQL> with t(hiredate)
2 AS
3 (
4 select '28-feb-2018' FROM DUAL UNION ALL
5 select '30-feb-2018' FROM DUAL UNION ALL
6 select '31-apr-2018' FROM DUAL UNION ALL
7 select '31-jun-2018' FROM DUAL
8 )
9 SELECT hiredate
,TO_DATE(hiredate DEFAULT NULL ON CONVERSION ERROR
,'DD-MON-YYYY') valid_date
FROM t;
HIREDATE VALID_DATE
----------- ---------
28-feb-2018 28-FEB-18
30-feb-2018 NULL
31-apr-2018 NULL
31-jun-2018 NULL