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

时间:2015-11-24 10:58:27

标签: sql oracle plsql oracle10g date-arithmetic

我正在尝试计算忽略非工作时间的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;

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

感谢

1 个答案:

答案 0 :(得分:1)

您可以在 WHERE 子句中使用 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,并根据它返回日期时间值。

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

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