一般的年份除以4,有余数的是平年,没有余数的是闰年,但如果是年份是整百的,那么该年份除以400,有余数的是平年,没有余数的是闰年。
JAVA算法如下:
PLSQL脚本方法如下:
平年年闰年判断1:(判断本年2月是否有29号;顺带本年第一天、月份+1、最后一天)
SELECT ---截断函数TRUNC TRUNC(SYSDATE,'YYYY') 本年第一天年月日 ,ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),1) 本年2月第一天年月日 ,LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),1)) as "本年2月最后一天" ,TO_CHAR(LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),1)),'DD') 本年2月最后一天日 ,TO_CHAR(LAST_DAY(ADD_MONTHS(TRUNC(to_date('20240331','yyyymmdd'),'YYYY'),1)),'DD') 指定日期当年2月 ,CASE WHEN TO_CHAR(LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),1)),'DD')=29 THEN '闰年' ELSE '平年' END AS 平年闰年的判断 FROM DUAL
平年闰年判断2:(判断年份能被4整除并且不能被100整除 或者能被400整除)
select cast(to_char(SYSDATE,'yyyy')as number) 当前年, to_number(to_char(SYSDATE,'yyyy')) 当前年, ---能被4整除不能被100整除 或者 能被400整除 case when (mod((to_number(to_char(SYSDATE,'yyyy'))),4) = 0 and mod((to_number(to_char(SYSDATE,'yyyy'))),100) <> 0 ) or mod((to_number(to_char(SYSDATE,'yyyy'))),400) = 0 THEN '闰年' ELSE '平年' end AS 平年闰年的判断 from dual
定义函数:
Oracle自定义函数定义:
create/replace function 函数名 (参数名 输入输出类型 字段类型) return 字段类型 is
变量名 字段类型; --函数的内部变量,需要包含字段类型的长度
begin
主体;
return(变量名);
end 函数名;
观察到:
定义函数的参数和输出类型的时候不需要考虑字段类型的长度;
函数的内部变量需包含字段类型的长度;
函数可以没有输入输出参数,但一定要有返回(return)的数据类型,因此必须有内部变量存储return的数据;
函数的输入输出参数可以在主体中直接使用。
函数的执行:
--sqlplus
var 变量名 字段类型(包含长度);
exec :变量名:=函数名(参数的值,接收输出变量的变量名)
--developer
select 函数名(参数) from dual;
实例方法一:
--**************************************************************************-- -- ** 内容:根据输入的年份判读平年闰年 -- ** 判断方法:当年2月是否有29号 --**************************************************************************-- CREATE OR REPLACE FUNCTION ping_run_year (i_year in number ) RETURN VARCHAR2 IS --定义返回(输出)字符类型 v_FLAG varchar2(20); --定义输出(返回)变量 BEGIN SELECT CASE WHEN TO_CHAR(LAST_DAY(ADD_MONTHS(to_date(concat(i_year,'0101'),'yyyymmdd'),1)),'DD')=29 THEN '闰年' ELSE '平年' END into v_FLAG FROM DUAL; RETURN (v_FLAG); --输出(返回)值,记得要括号。 END ;
执行函数结果:
实例方法2:
--**************************************************************************-- -- ** 内容:根据输入的年份判读平年闰年 -- ** 判断方法:判断年份能被4整除并且不能被100整除 或者能被400整除 --**************************************************************************-- CREATE OR REPLACE FUNCTION ping_run_year2 (i_year in number ) RETURN VARCHAR2 IS --定义返回(输出)字符类型 v_FLAG varchar2(20); --定义输出(返回)变量 BEGIN select ---能被4整除不能被100整除 或者 能被400整除 case when (mod(i_year,4) = 0 and mod(i_year,100) <> 0 ) or mod(i_year,400) = 0 THEN '闰年' ELSE '平年' end into v_FLAG FROM DUAL; RETURN (v_FLAG); --输出(返回)值,记得要括号。 END ;
执行函数结果: