计算忽略非工作时间的时差

Calculate time difference ignorning non-work hours

我正在尝试计算忽略非工作时间的 2 个日期时间值之间的差异。最初它只是查看差异并将其计算为分钟但是它只需要计算周一至周五上午 9 点至晚上 8 点和周六上午 9 点至下午 1 点之间的小时数,忽略所有其他时间。我在 oracle 10g 系统上。

我目前的代码如下:

 begin 

 debug.debug('sp_access');

update cl_case b
    set time_to_sp_access = 
    (
    select (x.date_created-e.date_created)*1440
    from cl_case c, eventlog e, eventlog x
    where c.id=e.case_id
    and x.case_id=e.case_id
    and b.id=e.case_id
    and e.id=
                 (    select min(id) from eventlog mini
                      where mini.case_id=e.case_id
                      and mini.cl_code in ('AAAA','BBBB','CCCC','DDDD')
                 )
    and x.id=
                 (     select min(id) from eventlog minix
                       where minix.case_id=e.case_id
                       and minix.cl_code in  ('EEEE','FFF','GGG','HHHH','JJJJ','KKKK','LLLL')
                 )
    )
where id in 
    (    select unique case_id 
        from   eventlog elog
        where  elog.sptime_needs_setting ='Y'
    );

    commit;

end sp_access;

如何计算指定时间之间的时间?

谢谢

您可以在 WHERE 子句中使用 CASE 表达式。由于有两个日期时间值,因此需要使用两个 case 表达式。

例如,CASE 表达式的计算结果为:

SQL> SELECT
  2    CASE
  3      WHEN TO_CHAR(SYSDATE, 'DY') BETWEEN '1' AND '5'
  4      THEN TO_DATE(TO_CHAR(TRUNC(SYSDATE), 'MM/DD/YYYY')
  5        ||' 08:00:00 PM', 'MM/DD/YYYY HH:MI:SS PM')
  6      ELSE TO_DATE(TO_CHAR(TRUNC(SYSDATE), 'MM/DD/YYYY')
  7        ||' 01:00:00 PM', 'MM/DD/YYYY HH:MI:SS PM')
  8    END my_time
  9  FROM dual;

MY_TIME
----------------------
11/24/2015 01:00:00 pm

以上示例检查 DAY 的 SYSDATE,并根据它 returns 日期时间值。

使用上面的示例,由于您有两个不同的日期时间值作为日期范围条件进行比较,因此您需要在 WHERE 中使用两个 CASE 表达式子句.

WHERE date_column 
BETWEEN
   CASE
      WHEN TO_CHAR(date_column, 'DY') BETWEEN '1' AND '5' 
      THEN
         TO_DATE(TO_CHAR(
                 TRUNC(date_column), 'MM/DD/YYYY') 
                   ||' 09:00:00 AM', 'MM/DD/YYYY HH:MI:SS PM')
      ELSE
         TO_DATE(TO_CHAR(
                 TRUNC(date_column), 'MM/DD/YYYY') 
                   ||' 09:00:00 AM', 'MM/DD/YYYY HH:MI:SS PM')
   END 
AND
   CASE
      WHEN TO_CHAR(date_column, 'DY') BETWEEN '1' AND '5' 
      THEN
         TO_DATE(TO_CHAR(
                 TRUNC(date_column), 'MM/DD/YYYY') 
                    ||' 08:00:00 PM', 'MM/DD/YYYY HH:MI:SS PM')
      ELSE
         TO_DATE(TO_CHAR(
                 TRUNC(date_column), 'MM/DD/YYYY') 
                    ||' 01:00:00 PM', 'MM/DD/YYYY HH:MI:SS PM')
   END