今天给各位分享oracle时间相减的知识,其中也会对oracle两个时间相减得到分钟进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录
一、oracle 时间相减函数
创建一个日期比较的函数(datediff,网上找的),然后通过该函数返回天数×8.5就是总共的小时数了,如果要精确点的话,就把首尾天数中的时间差刨了即可。
create or replace function datediff
/*************************************************************************/
/*功能:返回两个日期之间的天、周、月、年等数量。*/
/*入参说明: p_Component时间元件,如年月日季度等等*/
/*************************************************************************/
v_Ret *** nValue number;--结果数值
v_Component varchar2(10);--日期组件中间转换形式,截取空格并且转为大写
v_YearNum1 number;--减数年份数
v_YearNum2 number;--被减数年份数
v_MonthNum1 number;--减数月份数
v_MonthNum2 number;--被减数月份数
v_Ho *** Num2 number;--被减数时数
v_MinuteNum1 number;--减数分钟数
v_MinuteNum2 number;--被减数分钟数
v_SecondNum1 number;--减数秒钟数
v_SecondNum2 number;--减数秒钟数
v_QuarterValue1 number;--减数季度数
v_QuarterValue2 number;--被减数季度数
v_WeekNum1 number;--减数与标准时间周差
v_WeekNum2 number;--被减数与标准时间周差
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_Ret *** nValue:= v_YearNum2- v_YearNum1;
elsif v_Component in('M','MM','MONTH','MON') then--月情况
--请注意,这个部分与oracle内置日期函数MONTH_BETWEEN()不同,忽略了日因素
--而后者的两个日期如都是所在月的最后一天,才返回整数,否则,返回分数
--而且这个分数是以31天作为一个月进行计算的结果
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_Ret *** nValue:=(v_YearNum2- v_YearNum1)*12+(v_MonthNum2- v_MonthNum1);
elsif v_Component in('D','DD','DAY') then--日情况
--这里与两个日期直接相减的oracle日期算术也不同,只返回整数天数;
--而后者可以返回一天的几分之几(以小数形式表达)
v_Ret *** nValue:= 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--时情况
v_Ret *** nValue:=(to_date(to_char(p_Minuend,'yyyy-mm-dd'),'YYYY-MM-DD')
- to_date(to_char(p_Subtranhend,'yyyy-mm-dd'),'YYYY-MM-DD'));
v_Ho *** Num1:= to_number(to_char(p_Subtranhend,'HH24'));
v_Ho *** Num2:= to_number(to_char(p_Minuend,'HH24'));
v_Ret *** nValue:= v_Ret *** nValue*24+(v_Ho *** Num2- v_Ho *** Num1);
elsif v_Component in('MI','MINUTE') then--分情况
v_Ret *** nValue:=(to_date(to_char(p_Minuend,'yyyy-mm-dd'),'YYYY-MM-DD')
- to_date(to_char(p_Subtranhend,'yyyy-mm-dd'),'YYYY-MM-DD'));
v_Ho *** Num1:= to_number(to_char(p_Subtranhend,'HH24'));
v_Ho *** Num2:= to_number(to_char(p_Minuend,'HH24'));
v_Ret *** nValue:= v_Ret *** nValue*24+(v_Ho *** Num2- v_Ho *** Num1);
v_MinuteNum1:= to_number(to_char(p_Subtranhend,'MI'));
v_MinuteNum2:= to_number(to_char(p_Minuend,'MI'));
v_Ret *** nValue:= v_Ret *** nValue*60+(v_MinuteNum2- v_MinuteNum1);
elsif v_Component in('S','SS','SECOND') then--秒情况
v_Ret *** nValue:=(to_date(to_char(p_Minuend,'yyyy-mm-dd'),'YYYY-MM-DD')
- to_date(to_char(p_Subtranhend,'yyyy-mm-dd'),
v_Ho *** Num1:= to_number(to_char(p_Subtranhend,'HH24'));
v_Ho *** Num2:= to_number(to_char(p_Minuend,'HH24'));
v_Ret *** nValue:= v_Ret *** nValue*24+(v_Ho *** Num2- v_Ho *** Num1);
v_MinuteNum1:= to_number(to_char(p_Subtranhend,'MI'));
v_MinuteNum2:= to_number(to_char(p_Minuend,'MI'));
v_Ret *** nValue:= v_Ret *** nValue*60+(v_MinuteNum2- v_MinuteNum1);
v_SecondNum1:= to_number(to_char(p_Subtranhend,'SS'));
v_SecondNum2:= to_number(to_char(p_Minuend,'SS'));
v_Ret *** nValue:= v_Ret *** nValue*60+(v_SecondNum2- v_SecondNum1);
elsif v_Component in('Q',' *** ','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_Ret *** nValue:=(v_YearNum2- v_YearNum1)*4+(v_QuarterValue2- v_QuarterValue1);
elsif v_Component in('W','WW','WK','WEEK') then--周情况
--关于周差的计算,尝试采用中间日期的 ***
--经查,‘1-1-2’即公元一年1月2日为周日,我们就可以用两个时间分别与其相减求周差
--两个结果再相减,即可得到正确的数值
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_Ret *** nValue:= v_WeekNum2- v_WeekNum1;
二、Oracle中两个to_date相减能得到天数吗
Oracle中两个to_date相减能得到天数,解决 *** 如下:
1、首先打开Oracle管理工具,执行如下图所示的语句来查询一下 *** 时间,会看到显示的并不是平常用到的。
2、接下来就可以通过to_char函数来对日期函数进行转换一下,如下图所示,之一个参数是时间,第二个是格式化类型。
3、另外也可以通过To_Char函数来对日期进行拆分,分别取出年月日,如下图所示。
4、接下来还可以通过To_Date函数来对字符串进行日期转换,如下图所示。
5、最后,还可以通过To_number函数来将字符数字转换为数字来进行运算,如下图所示。
三、在Oracle中怎么求两个时间相差的天数
可以使用sql语句,将起始时间与结束时间相减就可以了,语句如下:
TO_DATE('2018-6-5','yyyy-mm-dd hh24:mi:ss')- TO_DATE('2018-5-31','yyyy-mm-dd hh24:mi:ss'))AS相差天数 from dual;
1、在使用Oracle的to_ date函数来做日期转换时,可能会直觉地采用"yyyy-MM-dd HH:mm:ss"的格式作为格式进行转换,但是在Oracle中会引起错误:“ORA 01810格式代码出现两次”。
如: select to_ date(2005-01-01 13:14:20','yyy-MM-dd HH24:mm:ss') from dual;
原因是SQL中不区分大小写, MM和mm被认为是相同的格式代码,所以Oracle的SQL采用了mi代替分钟。
select to_ date(2005-01-01 13:14:20'yyyy-MM-dd HH24:mi:s') from dual;
2、另要以24小时的形式显示出来要用HH24
select to_ char(sysdate,'yyy-MM-dd HH24:miss') from dual;//mi是分钟
select to_ char(sysdate,'yyy-MM-dd HH24:mm:ss') from dual://mm会显示月份
关于oracle时间相减和oracle两个时间相减得到分钟的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。