Oracle日期校验函数

使用背景:公司有一个存储过程,insert 总是不成功,之后debug,看到insert语句中有对日期处理的函数,
TO_CHAR (TO_DATE (v_slot_date, ‘yyyy-mm-dd‘),‘yyyy-mm‘)
查看跳出进入exception时的v_slot_date值,发现v_slot_date是‘2013.12月‘,才恍然大悟,原来是传入的
日期字符串不规范,所以导致inset出现异常。所以就准备些一个函数来判断录入日期的正确性。

1,,如何使用本函数
(1), 在SQL语句中使用:

SQL> SELECT FN_ISDATE(REPLACE(‘2015-05-12‘,‘-‘,‘‘)) FROM DUAL;
FN_ISDATE(REPLACE(‘2015-05-12‘
------------------------------
                             1

SQL> SELECT FN_ISDATE(REPLACE(‘2015-05-32‘,‘-‘,‘‘)) FROM DUAL;
FN_ISDATE(REPLACE(‘2015-05-32‘
------------------------------
                             0

SQL> 

(2),在存储过程中使用:

CREATE OR REPLACE PROCEDURE
IS
BEGIN
	IF FN_ISDATE(slotDate)=1
	    THEN
	    INSERT INTO PESK.R_HR_SLOT(....)VALUES(......);
	    COMMIT;
	END IF;
END

2,存储函数内容如下:

create or replace function FN_ISDATE
(
    v_datestr VARCHAR2  --日期入参
)
return number -- 返回1为正确,0为错误。
as
/*------------------------------------------------------------------------
 公用函数:日期检查函数
 调用范例: select FN_ISDATE(‘20140501‘) from dual;
------------------------------------------------------------------------*/
    i_year  number; --年
    i_month number; --月
    i_day   number; --日
    d_tjrq  date;   --日期类型的日期
begin

if v_datestr is null then
  return 0;
end if;

if length(trim(v_datestr)) <> 10 then
  return 0;
end if;

-- 判断日期由数字组成
if regexp_substr(trim(v_datestr),‘[[:digit:]]+‘) is null then
  return 0;
end if;

-- 截取出年份
i_year:=to_number(substr(rtrim(v_datestr),1,4));

-- 截取出月份
i_month:=to_number(substr(rtrim(v_datestr),6,2));

-- 截取出日期
i_day:=to_number(substr(rtrim(v_datestr),9,2));

-- 对月份进行判断,必须在1月到12月范围之内
if i_month not between 1 and 12 then
    begin
        return 0;
    end;
end if;

-- 对日期的判断,1,3,5,7,8,10,12月最大日为31,4,6,9,11月最大日为30,2月若为闰年则为29,其它年则为28.
if i_day between 1 and 31 then
    begin
        if i_day=31 and i_month not in (1,3,5,7,8,10,12) then
            begin
                return 0;
            end;
        end if;
        if i_month=2 then
            begin
    -- Rules 1:普通年能被4整除且不能被100整除的为闰年。
    -- Rules 2:世纪年能被400整除的是闰年。
    -- Rules 3:对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如172800年是闰年,86400年不是闰年。
                if ((mod(i_year,4)=0 and mod(i_year,100)<>0)
      or mod(i_year,400)=0
      or (mod(i_year,3200)=0 and mod(i_year,172800)=0)) then
                    begin
                    --若为闰年,则2月份最大日为29
                        if i_day>29 then
                            begin
                                return 0;
                            end;
                        end if;
                    end;
                else
                    begin
                    --若不为闰年,则2月份最大日为28
                        if i_day>28 then
                            begin
                                return 0;
                            end;
                        end if;
                    end ;
                end if;
            end;
        end if;
        return 1;
    end;
else
    return 0;
end if;
end;

欢迎大家提出更好的改进意见。

Oracle日期校验函数

时间: 2024-10-12 13:23:14

Oracle日期校验函数的相关文章

ORACLE日期时间函数大全

ORACLE日期时间函数大全    TO_DATE格式(以时间:2007-11-02   13:45:25为例) Year:              yy two digits 两位年                显示值:07        yyy three digits 三位年                显示值:007        yyyy four digits 四位年                显示值:2007 Month:              mm    numbe

ORACLE日期时间函数

ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02   13:45:25为例)           Year:              yy two digits 两位年                显示值:07        yyy three digits 三位年                显示值:007        yyyy four digits 四位年                显示值:2007                    Month

oracle 日期时间函数

ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02   13:45:25为例)           Year:              yy two digits 两位年                显示值:07        yyy three digits 三位年                显示值:007        yyyy four digits 四位年                显示值:2007                    Month

oracle日期时间函数总结

经常写 sql 的同学应该会接触到一些 oracle 的日期时间函数, 例如: 财务软件或者人力资源软件需要按照每年, 每季度, 每月, 甚至每个星期来进行统计. 今天闲来没事, 特意从网上整理了一些资料, 以备日后查阅. 一.常用日期数据格式 1. 获取年的最后一位, 两位, 三位, 四位 select to_char(sysdate,'Y') from dual;    -- 获取年的最后一位 select to_char(sysdate,'YY') from dual;    -- 获取年

[转]ORACLE日期时间函数大全

TO_DATE格式(以时间:2007-11-02   13:45:25为例)           Year:              yy two digits 两位年                显示值:07        yyy three digits 三位年                显示值:007        yyyy four digits 四位年                显示值:2007                    Month:             

【转】ORACLE日期时间 等函数大全

转自:ORACLE日期时间函数大全 ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02   13:45:25为例)           Year:              yy two digits 两位年                显示值:07        yyy three digits 三位年                显示值:007        yyyy four digits 四位年                显示值:2007       

Oracle -&gt;&gt; 日期函数

Oracle下的日期时间函数和SQL SERVER真他妈不同.这个真需要时间适应. ---------------------------------------------日期/时间函数----------------------------------------------- --1: SYSDATE 用来得到系统的当前日期 SELECT SYSDATE FROM DUAL; --2: ADD_MONTHS 增加或减去月份 SELECT TO_CHAR(ADD_MONTHS(TO_DATE

Oracle 11g SQL fundamentals 03 -- 日期操作函数

1.Oracle日期在内部的表示是数值格式,精确度从世纪到秒. 2.默认的日期表示格式为DD-MON-RR  (不是YY) YY 与 RR 的区别: 3.日期操作函数 示例: NEXT_DAY的第二个参数也可以是数字,表示几天后的日期.LAST_DAY是求该日期所在月份的最后一天. ROUND('DD-11-2014','MONTH')是精确到月,‘日’1-15号算这个月的 ('01-11-2014'),超过15号算下个月的 ('01-12-2014'). ROUND('DD-MON-2014'

oracle 日期函数 求年的最后一天、第一天,月的最后一天

add_months(trunc(to_date('2013','yyyy') ,'yyyy'),12)-1  2013年最后一天 trunc(to_date('2013','yyyy') ,'yyyy')  2013年第一天 5月的最后一天 select last_day(to_date('2013-05','yyyy-mm')) d from dual oracle 日期函数 求年的最后一天.第一天,月的最后一天,布布扣,bubuko.com