现有一个表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小时 求一个通用的 函数 来实现该功能

解决方案 »

  1.   

    使用round(to_number(开始时间-结束时间)*24)这个计算的是小时(四舍五入)
      

  2.   

    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)
      

  3.   

    谢谢 "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;