oracle 日期加3个月,三个日期函数(十分有用)!!!!!!!!
函數(shù)一:
CREATE OR REPLACE FUNCTION dayadd(
p_Component ? ? ? ? varchar2,
p_Number? ? ? ? number,
p_Date? ? ? ? ? ? ? ? date)
RETURN DATE
IS
/****************************************************************/
/*? ?? ?該函數(shù)為日期計算函數(shù)主要是計算〕? ?? ?? ?? ?? ?? ?? ?? ?*/
/*? ? 從當前日期開始經(jīng)過多少日、季、月、年等后的日期。? ?? ?? ? */
/*? ???入?yún)⒄f明:p_Component ? ? ? ? 時間元件,如年月日季度等等? ?? ?*/
/*? ? ? ?? ?? ?? ? p_Number? ? ? ? 加數(shù), 注意:應(yīng)該為整數(shù)(可正可負)??*/
/*? ? ? ? ? ? ? ???p_Date? ? ? ? ? ? ? ? 基準時間? ?? ?? ?? ?? ?? ?? ?? ?? ? */
/*??注意:其他日期元件,如世紀等等,暫時未考慮? ?? ?? ?? ?? ?? ?*/
/****************************************************************/
v_Component??? ? ? ? ? ? ? ? varchar2(10);
v_MiddleNumber??? ? ? ? number;
v_ReturnValue_Str ? ? ? ? varchar2(20);? ?--字符串日期格式
v_ReturnValue ? ? ? ? ? ? ? ? date;? ?? ?? ???--返回日期
BEGIN
v_Component := upper(ltrim(rtrim(p_Component)));
if v_Component in ('Y','YY','YEAR','YYYY')? ? then? ?? ?--年情況
v_ReturnValue := add_months(p_Date,p_Number*12);
elsif v_Component in ('M','MM','MONTH','MON') then? ?? ?--月情況
v_ReturnValue := add_months(p_Date,p_Number);
elsif v_Component in ( 'D', 'DD', 'DAY')? ?? ?then ? ? ? ???--日情況
v_ReturnValue := p_Date + p_Number;
elsif v_Component in ('H', 'HH', 'HOUR')? ?? ?then ? ? ? ???--時情況
v_ReturnValue := p_Date + p_Number/24;
elsif v_Component in ('MI','MINUTE')? ?? ?? ? then ? ? ? ???--分情況
v_ReturnValue := p_Date + p_Number/1440;
elsif v_Component in('S', 'SS', 'SECOND')? ???then ? ? ? ???--秒情況
v_ReturnValue := p_Date + p_Number/86400;
elsif v_Component in ('Q','QQ','QUARTER')? ???then ? ? ? ???--季度情況
v_ReturnValue := p_Date + p_Number*3;
elsif v_Component in ('W','WW','WK','WEEK')? ? then ? ? ? ???--周情況
v_ReturnValue := p_Date + p_Number*7;
else
v_ReturnValue := to_date('1-1-1','yyyy-mm-dd');
end if;
RETURN v_ReturnValue;
EXCEPTION
WHEN OTHERS THEN
RETURN to_date('1-1-1','yyyy-mm-dd');? ?? ?? ?? ?? ???--例外處理
END;
函數(shù)二:
create or replace function datediff
(p_Component??varchar2 ,
p_Subtranhend??date,
p_Minuend date)
RETURN NUMBER
IS
/*************************************************************************/
/*? ?? ?功? ? 能:返回兩個日期之間的天、周、月、年等數(shù)量。? ?? ?? ?? ?? ?*/
/*? ?? ?入?yún)⒄f明: p_Component? ? 時間元件,如年月日季度等等? ?? ?? ?? ? */
/*? ?? ?? ?? ?? ???p_Subtrahend? ?減數(shù)時間? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? */
/*? ?? ?? ?? ?? ???p_Minuend? ???被減數(shù)時間? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?*/
/*************************************************************************/
v_ReturnValue? ?number ;? ?? ?-- 結(jié)果數(shù)值
v_Component? ???varchar2(10); --日期組件中間轉(zhuǎn)換形式,截取空格并且轉(zhuǎn)為大寫
v_YearNum1? ?? ?number;? ?? ? --減數(shù)年份數(shù)
v_YearNum2? ?? ?number;? ?? ? --被減數(shù)年份數(shù)
v_MonthNum1? ???number;? ?? ? --減數(shù)月份數(shù)
v_MonthNum2? ???number;? ?? ? --被減數(shù)月份數(shù)
v_HourNum1? ?? ?number;? ?? ? --減數(shù)時數(shù)
v_HourNum2? ?? ?number;? ?? ? --被減數(shù)時數(shù)
v_MinuteNum1? ? number;? ?? ? --減數(shù)分鐘數(shù)
v_MinuteNum2? ? number;? ?? ? --被減數(shù)分鐘數(shù)
v_SecondNum1? ? number;? ?? ? --減數(shù)秒鐘數(shù)
v_SecondNum2? ? number;? ?? ? --減數(shù)秒鐘數(shù)
v_QuarterValue1 number;? ?? ? --減數(shù)季度數(shù)
v_QuarterValue2 number;? ?? ? --被減數(shù)季度數(shù)
v_WeekNum1? ?? ?number;? ?? ? --減數(shù)與標準時間周差
v_WeekNum2? ?? ?number;? ?? ? --被減數(shù)與標準時間周差
BEGIN
v_Component := upper(ltrim(rtrim(p_Component)));
if v_Component in ('Y','YY','YEAR','YYYY') then? ?--年情況
v_YearNum1??:= to_number(to_char(p_Subtranhend,'YYYY'));
v_YearNum2 := to_number(to_char(p_Minuend,'YYYY')) ;
v_ReturnValue := v_YearNum2 - v_YearNum1;
elsif v_Component in ('M', 'MM','MONTH', 'MON') then? ? --月情況
--請注意,這個部分與oracle內(nèi)置日期函數(shù)MONTH_BETWEEN()不同,忽略了日因素
--而后者的兩個日期如都是所在月的最后一天,才返回整數(shù),否則,返回分數(shù)
--而且這個分數(shù)是以31天作為一個月進行計算的結(jié)果
v_YearNum1??:= to_number(to_char(p_Subtranhend,'YYYY'));
v_YearNum2 := to_number(to_char(p_Minuend,'YYYY')) ;
v_MonthNum1 := to_number(to_char(p_Subtranhend,'MM'));
v_MonthNum2 := to_number(to_char(p_Minuend,'MM'));
v_ReturnValue := (v_YearNum2 - v_YearNum1)*12 + (v_MonthNum2 - v_MonthNum1);
elsif v_Component in ( 'D', 'DD', 'DAY') then? ???--日情況
--這里與兩個日期直接相減的oracle日期算術(shù)也不同,只返回整數(shù)天數(shù);
--而后者可以返回一天的幾分之幾(以小數(shù)形式表達)
v_ReturnValue := to_date(to_char(p_Minuend,'yyyy-mm-dd'),'YYYY-MM-DD')
- to_date(to_char(p_Subtranhend,'yyyy-mm-dd'),'YYYY-MM-DD');
elsif v_Component in ('H', 'HH', 'HOUR') then? ???--時情況
--第一步:求出天數(shù)
v_ReturnValue := (to_date(to_char(p_Minuend,'yyyy-mm-dd'),'YYYY-MM-DD')
- to_date(to_char(p_Subtranhend,'yyyy-mm-dd'), 'YYYY-MM-DD'));
--第二步:求出時數(shù)
v_HourNum1 := to_number(to_char(p_Subtranhend,'HH24'));
v_HourNum2 := to_number(to_char(p_Minuend,'HH24'));
v_ReturnValue := v_ReturnValue*24 + (v_HourNum2 - v_HourNum1);
elsif v_Component in ('MI','MINUTE') then? ???--分情況
--第一步:求出天數(shù)
v_ReturnValue := (to_date(to_char(p_Minuend,'yyyy-mm-dd'),'YYYY-MM-DD')
- to_date(to_char(p_Subtranhend,'yyyy-mm-dd'), 'YYYY-MM-DD'));
--第二步:求出時數(shù)
v_HourNum1 := to_number(to_char(p_Subtranhend,'HH24'));
v_HourNum2 := to_number(to_char(p_Minuend,'HH24'));
v_ReturnValue := v_ReturnValue*24 + (v_HourNum2 - v_HourNum1);
--第三步:求出分鐘數(shù)
v_MinuteNum1 := to_number(to_char(p_Subtranhend,'MI'));
v_MinuteNum2 := to_number(to_char(p_Minuend,'MI'));
v_ReturnValue := v_ReturnValue*60 + (v_MinuteNum2 - v_MinuteNum1);
elsif v_Component in('S', 'SS', 'SECOND') then? ???--秒情況
--第一步:求出天數(shù)
v_ReturnValue := (to_date(to_char(p_Minuend,'yyyy-mm-dd'),'YYYY-MM-DD')
- to_date(to_char(p_Subtranhend,'yyyy-mm-dd'),
'YYYY-MM-DD'));
--第二步:求出時數(shù)
v_HourNum1 := to_number(to_char(p_Subtranhend,'HH24'));
v_HourNum2 := to_number(to_char(p_Minuend,'HH24'));
v_ReturnValue := v_ReturnValue*24 + (v_HourNum2 - v_HourNum1);
--第三步:求出分鐘數(shù)
v_MinuteNum1 := to_number(to_char(p_Subtranhend,'MI'));
v_MinuteNum2 := to_number(to_char(p_Minuend,'MI'));
v_ReturnValue := v_ReturnValue*60 + (v_MinuteNum2 - v_MinuteNum1);
--第四步:求出秒鐘數(shù)
v_SecondNum1 := to_number(to_char(p_Subtranhend,'SS'));
v_SecondNum2 := to_number(to_char(p_Minuend,'SS'));
v_ReturnValue := v_ReturnValue*60 + (v_SecondNum2 - v_SecondNum1);
elsif v_Component in ('Q','QQ','QUARTER') then? ???--季度情況
v_YearNum1??:= to_number(to_char(p_Subtranhend,'YYYY'));
v_YearNum2 := to_number(to_char(p_Minuend,'YYYY')) ;
v_QuarterValue1 := to_number(to_char(p_Subtranhend,'Q'));
v_QuarterValue2 := to_number(to_char(p_Minuend,'Q'));
v_ReturnValue := (v_YearNum2 - v_YearNum1)*4 + (v_QuarterValue2 - v_QuarterValue1);
elsif v_Component in ('W','WW','WK','WEEK') then? ? --周情況
--一周的起始日期應(yīng)當為星期日
--關(guān)于周差的計算,嘗試采用中間日期的方法
--經(jīng)查,‘1-1-2’即公元一年1月2日為周日,我們就可以用兩個時間分別與其相減求周差
--兩個結(jié)果再相減,即可得到正確的數(shù)值
v_WeekNum1 :=??floor(??(to_date(to_char(p_Subtranhend,'YYYY-MM-DD'),'YYYY-MM-DD') -
to_date('1-1-2','YYYY-MM-DD'))/7);
v_WeekNum2 :=??floor(??(to_date(to_char(p_Minuend,'YYYY-MM-DD'),'YYYY-MM-DD') -
to_date('1-1-2','YYYY-MM-DD'))/7);
v_ReturnValue := v_WeekNum2 - v_WeekNum1;
else
v_ReturnValue := -88888;
end if;
RETURN v_ReturnValue;
EXCEPTION
WHEN OTHERS THEN
RETURN -99999;--例外處理
END datediff;
函數(shù)三:
create or replace function datepart(
p_Component ? ? ? ? varchar2,
p_Date? ? ? ? ? ? ? ? date)
RETURN NUMBER
IS
/*************************************************************************/
/*? ?? ? 功? ?能:獲取某個日期中的部分時間元件(日、月、年、分、秒、等) */
/*? ?? ? 入?yún)⒄f明:? ? ? ? p_Component 時間元件,如年月日季度等等? ?? ?? ?? ?? ?*/
/*? ?? ?? ? ? ? ? ? ? ? ? ? p_Date? ? ? ?? ???需要解析的時間? ?? ?? ?? ?? ?? ?? ?? ?? ?*/
/*************************************************************************/
v_Component? ?varchar2(10);
v_ReturnValue NUMBER;
BEGIN
v_Component := upper(ltrim(rtrim(p_Component)));
if v_Component in ('Y','YY','YEAR','YYYY') then ? ? ? ? ? ? ? ? --年情況
v_ReturnValue := to_number(to_char(p_Date,'YYYY')) ;
elsif v_Component in ('M', 'MM','MONTH', 'MON') then ? ? ? ? ? ? ? ? ? ? ? ? --月情況
v_ReturnValue := to_number(to_char(p_Date,'MM')) ;
elsif v_Component in ( 'D', 'DD', 'DAY') then ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --日情況
v_ReturnValue := to_number(to_char(p_Date,'DD')) ;
elsif v_Component in ('H', 'HH', 'HOUR', 'HH24') then ? ? ? ? ? ? ? ? ? ? ? ? --時情況
v_ReturnValue := to_number(to_char(p_Date,'HH24')) ;
elsif v_Component in ('MI','MINUTE') then ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --分情況
v_ReturnValue := to_number(to_char(p_Date,'MI')) ;
elsif v_Component in('S', 'SS', 'SECOND') then ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --秒情況
v_ReturnValue := to_number(to_char(p_Date,'SS')) ;
elsif v_Component in ('Q','QQ','QUARTER') then ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --季度情況
v_ReturnValue := to_number(to_char(p_Date,'Q')) ;
elsif v_Component in ('W','WW','WK','WEEK') then ? ? ? ? ? ? ? ? ? ? ? ? --周幾情況(周日為第一天)
v_ReturnValue := to_number(to_char(p_Date,'D')) ;
elsif v_Component in ('WEEK_NO') then ? ? ? ? ? ? ? ? ? ? ? ? -- 第幾周情況
v_ReturnValue := to_number(to_char(p_Date,'IW')) ;
else
v_ReturnValue := -88888;
end if;
RETURN v_ReturnValue;
EXCEPTION
WHEN OTHERS THEN
RETURN -99999;--例外處理
END datepart;
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的oracle 日期加3个月,三个日期函数(十分有用)!!!!!!!!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ckeditor java 使用,CKE
- 下一篇: oracle交流 提问,Oracle常见