oracle当前时间减去一个字段,oracle 时间相加减

1.分钟转成不同格式的时间

数据库里有个字段 存的分钟

① 现在想显示成HH:MM格式 假设为514分钟

SELECT to_char((to_date('00:00','HH24:MI')+514/24/60),'HH24:MI') from dual

输出结果:

08:34

②如果存的是秒 同理

SELECT to_char((to_date('00:00:00','HH24:MI:SS')+514/24/60/60),'HH24:MI:SS') from dual

输出结果:

00:08:34

至于显示成其他的格式,也就不成问题了

2.时分相加

至于为什么要写这个,是因为oracle里没有两个时间相加的处理,两个to_date相减可以,相加就出错了:数据库里有两个字段 存的都是HH:MM格式的时间

假设一个是本月上午缺勤时间合计: 08:30(8个半小时)

另外一个是本月下午缺勤时间合计: 00:30(半小时)

现在想要总缺勤时间,显示成 HH:MM格式

做法有两种

① 正常的逻辑运算(代码或者PLSQL实现的应该比这个容易的多,仅限于SQL实现):

select  LPAD((substr('08:30',1,2) + substr('00:30',1,2)+(substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2))/60),2,'0') || ':' ||

LPAD(mod((substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2)),60),2,'0') from  dual

看起来很复杂,而实际上就是把小时相加,分钟相加,之后把分钟满60的小时进位,取余的显示:

取前两位相加得小时:(是因为不确定数据储存的格式是不是严格的HH:MM,而不能借正则分隔“:”)(substr('08:30',1,2) + substr('00:30',1,2)

取后两位相加得分钟:

(substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2))

把分钟满60的小时进位得显示用的小时:

(substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2))/60

现在小时算完了,不足两位左补零: LPAD((substr('08:30',1,2) + substr('00:30',1,2)+(substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2))/60),2,'0')

把分钟取余得显示用的分钟:

mod((substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2)),60)

现在分钟算完了,不足两位左补零:

LPAD(mod((substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2)),60),2,'0')

最后连上“:”就变成上述的SQL,得到的时间用HH:MM显示了

输出结果:

09:00

②函数实现:

SELECT to_char(to_date('00:00','HH24:MI') +(((to_date('08:30','HH24:MI') - trunc(to_date('08:30','HH24:MI'))) *24*60  + (to_date('00:30','HH24:MI') - trunc(to_date('00:30','HH24:MI'))) *24*60)/24/60),'HH24:MI') from dual

同样看起来很复杂

首先把HH:MM的换成数值:

to_date('08:30','HH24:MI') - trunc(to_date('08:30','HH24:MI'))

输出结果:.354166666666666666666666666666666666666(其实是代表了一个时间,是以天为单位的)

现在

*24*60

把数值换成分钟:

(to_date('08:30','HH24:MI') - trunc(to_date('08:30','HH24:MI'))) *24*60

输出结果:510

也就是把

08:30 变成了510分

(to_date('00:30','HH24:MI') - trunc(to_date('00:30','HH24:MI'))) *24*60

输出结果:30(时间是.020833333333333333333333333333333333333)这两个

也就是把00:30 变成了30分

然后把两个分钟相加:

((to_date('08:30','HH24:MI') - trunc(to_date('08:30','HH24:MI'))) *24*60  + (to_date('00:30','HH24:MI') - trunc(to_date('00:30','HH24:MI'))) *24*60)

输出结果:

540

剩下的就是显示处理了,和1里面的做法一致:

to_char(to_date('00:00','HH24:MI') +(((to_date('08:30','HH24:MI') - trunc(to_date('08:30','HH24:MI'))) *24*60  + (to_date('00:30','HH24:MI') - trunc(to_date('00:30','HH24:MI'))) *24*60)/24/60),'HH24:MI')

输出结果:

3.

不论是方法①还是方法②,

这里都存在一个问题:如果时间相加之后超出23:59,系统就会报错,目前我用的涉及不到这个 就没写出来,如果有用到的直接再转成DD:HH:MM的格式就行了,也就是把小时数满24的进位取显示用的天

SELECT to_char(to_date('01 00:00','DD HH24:MI') +(((to_date('23:30','HH24:MI') - trunc(to_date('23:30','HH24:MI'))) *24*60  + (to_date('01:30','HH24:MI') - trunc(to_date('01:30','HH24:MI'))) *24*60)/24/60-1),'DD HH24:MI') from dual

输出结果:01 01:00(25小时)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值