You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL中验证VARCHAR列日期有效性及闰年并筛选无效行

找出DATE_TEST表中的无效日期记录

首先是用于创建测试表并插入数据的SQL:

CREATE TABLE DATE_TEST(DD VARCHAR2(40));

Insert into DATE_TEST VALUES('30-02-24');
Insert into DATE_TEST VALUES('12-01-24');
INSERT INTO DATE_TEST VALUES('15');

需求是筛选出**不符合日期格式或日期逻辑(比如闰年判断)**的无效记录,预期输出包含30-02-24(2月没有30日)和15(格式不匹配)。

解决方案

适用于Oracle 12c及以上版本

可以使用VALIDATE_CONVERSION函数直接验证字符串是否能转换为指定格式的日期,写法简洁高效:

SELECT DD
FROM DATE_TEST
WHERE VALIDATE_CONVERSION(DD AS DATE, 'DD-MM-RR') = 0;

逻辑说明

  • VALIDATE_CONVERSION(DD AS DATE, 'DD-MM-RR'):检查字段DD能否按照DD-MM-RR的格式转换为日期类型
  • 返回值为0表示转换失败(即记录为无效日期),返回1表示转换成功

适用于Oracle 12c之前的版本

可以通过捕获TO_DATE函数的转换异常来判断,比如用子查询方式:

SELECT DD
FROM DATE_TEST
WHERE NOT EXISTS (
    SELECT 1
    FROM DUAL
    WHERE TO_DATE(DD, 'DD-MM-RR') IS NOT NULL
);

也可以自定义判断函数:

CREATE OR REPLACE FUNCTION IS_VALID_DATE(p_date_str VARCHAR2, p_format VARCHAR2) RETURN NUMBER IS
    v_date DATE;
BEGIN
    v_date := TO_DATE(p_date_str, p_format);
    RETURN 1;
EXCEPTION
    WHEN OTHERS THEN
        RETURN 0;
END;
/

SELECT DD
FROM DATE_TEST
WHERE IS_VALID_DATE(DD, 'DD-MM-RR') = 0;

预期输出

DD
----------
30-02-24
15

内容的提问来源于stack exchange,提问作者Ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:57:07