对超出当月最大日期的字符型日期处理,如2012-02-30

raymonshi 2012-05-22 02:57:43
至于数据库为什么将日期,存储成字符,不去追究。当需要将字符转换为日期的时候,由于类似‘0000-00-00’及‘2012-02-30’这样的字符存在,不能直接转。我写了一个function,拿出来,抛砖引玉,大家多说说,类似情况是怎么处理的

create or replace function CheckOutDate(DateString in varchar2)
/*
入口参数:
1.需要为10位 如:2012-01-01
2.月份需要小于12
效果:若日超过当月最大日,则转换为月末
ps:若你现在看到的这段注释,请注意阅读,如果你的参数不满足需求,建议你修改本段程序,增加判断处理规则,但是不要影响将现在支持的功能
例如:增加对月份的判断、以及处理异常时,对字符串截取 改为根据‘-’进行截取
以上 written by 师蒙 2012-5-22
增加对0000-00-00的处理,转化为9999-01-01 add by shimeng 2012-5-22
*/
return varchar2 is
Result varchar2(10);
BEGIN
/*shimeng 将字符格式的日期转化为日期类型*/
IF DateString ='0000-00-00'
THEN select to_char(to_Date('9999-01-01', 'yyyy-mm-dd'), 'yyyy-mm-dd')
into Result
from dual;
return(Result);
ELSE select to_char(to_Date(DateString, 'yyyy-mm-dd'), 'yyyy-mm-dd')
into Result
from dual;
return(Result);
END IF;

EXCEPTION
/*shimeng 将字符格式的日期转化为日期类型,若字符不正确如 '2012-02-30' 则转换为 2012-2-29*/
when others then
select to_char(last_day(to_date(substr(DateString, 1, 7) || '01',
'yyyy-mm-dd')),
'yyyy-mm-dd')
into Result
from dual;
return(Result);
end CheckOutDate;
...全文
88 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
raymonshi 2012-05-24
  • 打赏
  • 举报
回复
求指导,自己顶起
raymonshi 2012-05-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

将日期存储成字符 又转回来 就不符合日期了?
[/Quote]
系统之前是怎么存的,不太清楚,我们是做数据仓库,抽取其它的系统数据。
  • 打赏
  • 举报
回复
将日期存储成字符 又转回来 就不符合日期了?

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧