如何写出这样的SQL语句?

[复制链接]
查看11 | 回复3 | 2008-2-13 12:43:03 | 显示全部楼层 |阅读模式
我有一个表,(a1 number(6),a2 varchar2(8)),其中A2 字段内容为19820103这样的出生日期,由于录入的错误,把不是
闰年的2月,可能录入 象19620229之类的出生日期,那我如何取出这样不符合的出生日期?谢谢!
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
输入不用日期控件?手写啊,而且应该是date类型,一开始的设计注定了今天的错误,肯定不止这种错误,如果单指这样的错误很简单,找出不是闰年的,2月还是29的就可以了,校验闰年算法很简单啊。
最好还是全部转换吧,写个pl/sql把错误的全找出来
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
是啊,先找個pl/sql找出所有的闰年,例子很多,再和這些結果做對比吧;
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
-- 写个函数,然后根据函数去判断:
create or replace function is_date(i_str varchar2)
return number
is
v_date date;
begin
-- to_date(i_str,'yyyymmdd') 中的 'yyyy-mm-dd' 是你的字符类型存储日期的格式!(你可以根据你的数据进行修改其格式)
select to_date(i_str,'yyymmdd') into v_date from dual;
if v_date is not null then
return 1;
else
return 0;
end if;
EXCEPTION
WHEN OTHERS
THEN
return 0;
end;
/

-- 再用 is_date()查一下,看是否存在其他非法(或日期格式不一样)的数据!
select * from tb_name where is_date(a2)=0;
-- 或者(排除空值)
select * from tb_name
where a2 is not null
and is_date(a2)=0;
-- 如果表中数据很多,且执行上面的查询效率很低的话,可以考虑在a2字段创建一个函数索引:
create index tb_idx on tb_name(is_date(a2));
-- 为什么:这样的问题,天天有人问呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行