** 求一个 函数 计算有效处理时间 **

帅的想哭 2012-12-17 05:10:12
现有一个表aaaa 其中 e 是起始时间(包含日期),f 是终止时间(包含日期)要求 求出从起始时间到终止时间具体是多长时间,具体到小时,下班时间不包括在内,每天8:30上班,18点下班,多谢!
处理时长:关闭时间-发起时间(只计营业时间:8:30-18:00),单位:小时;7.5小时工作时长,中午2小时的休息时间12:00到14:00 。
如:

发起时间:2012-12-13 15:40 -- 13号处理时长=15:40 - 8:30 - 2小时(中午午休)
关闭时间:2012-12-16 15:30 -- 16号处理时长=15:30 - 8:30 - 2小时(中午午休)

总时长=5.1小时 + 2*7.5(14,15号处理时长) + 5小时

求一个通用的 函数 来实现该功能
...全文
77 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
睿智天成 2012-12-18
  • 打赏
  • 举报
回复
引用 2 楼 starits 的回复:
引用 1 楼 Rexmax 的回复: 使用round(to_number(开始时间-结束时间)*24)这个计算的是小时(四舍五入) 你好,可能我没有说清楚。要求是只计营业时间:8:30-18:00内,营业时间之外的时间不计。
你就直接做个判断不就行了,判断时间是不是在8:30-18:00内不就行了,计算出来的事件再减去中午休息的时间,一天的工作时间不就有了。
帅的想哭 2012-12-18
  • 打赏
  • 举报
回复
引用 4 楼 Rexmax 的回复:
引用 2 楼 starits 的回复:引用 1 楼 Rexmax 的回复: 使用round(to_number(开始时间-结束时间)*24)这个计算的是小时(四舍五入) 你好,可能我没有说清楚。要求是只计营业时间:8:30-18:00内,营业时间之外的时间不计。 你就直接做个判断不就行了,判断时间是不是在8:30-18:00内不就行了,计算出来的事件再减去中午休……
谢谢 "Rexmax” 和 "restbely"的回复,问题已解决。 select a.apply_date, a.deal_date, (case when (datepart('HH', a.apply_date) * 60 + datepart('MI', a.apply_date)) < 8.5 * 60 and ((datepart('HH', a.deal_date) * 60 + datepart('MI', a.deal_date)) between 8.5 * 60 and 19 * 60) then datediff('MI', a.apply_date, case when (datepart('HH', a.deal_date) * 60 + datepart('MI', a.deal_date)) > 19 * 60 then to_date(to_char(a.deal_date, 'yyyy-MM-dd') || '19:00', 'yyyy-MM-dd hh24:Mi') when (datepart('HH', a.deal_date) * 60 + datepart('MI', a.deal_date)) < 8.5 * 60 then to_date(to_char(a.deal_date, 'yyyy-MM-dd') || '08:30', 'yyyy-MM-dd hh24:Mi') else a.deal_date end) - datediff('DD', a.apply_date, a.deal_date) * 13.5 * 60 else datediff('MI', case when (datepart('HH', a.apply_date) * 60 + datepart('MI', a.apply_date)) < 8.5 * 60 then to_date(to_char(a.apply_date, 'yyyy-MM-dd') || '08:30', 'yyyy-MM-dd hh24:Mi') when (datepart('HH', a.apply_date) * 60 + datepart('MI', a.apply_date)) > 19 * 60 then to_date(to_char(a.apply_date, 'yyyy-MM-dd') || '19:00', 'yyyy-MM-dd hh24:Mi') else a.apply_date end, case when (datepart('HH', a.deal_date) * 60 + datepart('MI', a.deal_date)) > 19 * 60 then to_date(to_char(a.deal_date, 'yyyy-MM-dd') || '19:00', 'yyyy-MM-dd hh24:Mi') when (datepart('HH', a.deal_date) * 60 + datepart('MI', a.deal_date)) < 8.5 * 60 then to_date(to_char(a.deal_date, 'yyyy-MM-dd') || '08:30', 'yyyy-MM-dd hh24:Mi') else a.deal_date end) - datediff('DD', a.apply_date, a.deal_date) * 13.5 * 60 end) from hfpmos.hffault_business_main a where a.deal_date is not null;
小海葵1 2012-12-17
  • 打赏
  • 举报
回复
select (enddd - startdd) * 27000 + (starth - 8) * 3600 + (endh - 8) * 3600 + (startm - 30) * 60 + (endm - 30) * 60 as resulttime from (select to_char(to_date(startdate, 'yyyy-mm-dd hh24:mi'), 'dd') as startdd, to_char(to_date(startdate, 'yyyy-mm-dd hh24:mi'), 'hh24') as starth, to_char(to_date(startdate, 'yyyy-mm-dd hh24:mi'), 'mi') as startm, to_char(to_date(enddate, 'yyyy-mm-dd hh24:mi'), 'dd') as enddd, to_char(to_date(enddate, 'yyyy-mm-dd hh24:mi'), 'hh24') as endh, to_char(to_date(enddate, 'yyyy-mm-dd hh24:mi'), 'mi') as endm from test)
帅的想哭 2012-12-17
  • 打赏
  • 举报
回复
引用 1 楼 Rexmax 的回复:
使用round(to_number(开始时间-结束时间)*24)这个计算的是小时(四舍五入)
你好,可能我没有说清楚。要求是只计营业时间:8:30-18:00内,营业时间之外的时间不计。
睿智天成 2012-12-17
  • 打赏
  • 举报
回复
使用round(to_number(开始时间-结束时间)*24)这个计算的是小时(四舍五入)

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧