日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 日期加3个月,三个日期函数(十分有用)!!!!!!!!

發(fā)布時間:2025/4/17 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 日期加3个月,三个日期函数(十分有用)!!!!!!!! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

函數(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ù), 注意:應該為整數(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? ? --周情況

--一周的起始日期應當為星期日

--關(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。