【问题标题】:Calculate time difference ignorning non-work hours计算时差忽略非工作时间
【发布时间】:2023-03-18 23:15:01
【问题描述】:

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

我怎样才能让它计算指定时间之间的时间?

谢谢

【问题讨论】:

  • 公共假期呢?

标签: sql oracle plsql oracle10g date-arithmetic


【解决方案1】:

您可以在 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,并根据它返回一个日期时间值。

使用上面的示例,由于您有两个不同的日期时间值要作为日期范围条件进行比较,因此您需要在 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

【讨论】:

  • 这应该添加到我的原始代码中的什么地方?它是第一个 where 语句吗?我是否也误解了一些东西,似乎如果这一天在周一和周五之间,那么它将开始时间设置为上午 9 点,而不检查实际时间。如果当天是例如星期二,则应检查时间是否在上午 9 点之后,如果在上午 9 点之后,则使用实际时间,如果在上午 9 点之前,则应使用上午 9 点作为开始时间。
  • @HardLeeWorking 根据问题中的信息发布一个工作示例和示例需要一些努力。如果您提供示例数据的创建和插入语句并显示您想要的输出,我将不胜感激。请编辑您的问题并添加这些详细信息。
  • @HardLeeWorking 另外,请参阅Stack Overflow tour 以了解该站点的工作原理。如果您觉得答案有帮助,请点赞,如果回答了您的问题,请接受。
猜你喜欢
  • 1970-01-01
  • 2019-01-11
  • 2018-08-16
  • 2019-11-11
  • 1970-01-01
  • 2021-07-09
  • 2017-07-11
  • 1970-01-01
  • 2013-11-05
相关资源
最近更新 更多