如何在两个日期之间仅获得9:00到21:00的时间

时间:2011-01-13 19:15:08

标签: sql oracle

我有两个时间戳,例如'20 -Nov-2010 20:11:22'开始和结束。现在我想计算9:00到21:00之间的时间,即12小时。

输入将是两个日期,例如'10 -Nov-2010'和'20 -Nov-2010'start dateend date

componentid   starttime               endtime                result  
3             13-Nov-2010 10:00:00    13-Nov-2010 21:00:00    11:00  hours  
5             14-Nov-2010 09:30:00    14-Nov-2010 22:00:00    11:30  and
3             15-Nov-2010 08:20:00    15-Nov-2010 20:00:00    11:00  minutes
4             16-Nov-2010 08:00:00    16-Nov-2010 23:00:00    12:00
                                                          sum 45:30

现在,从示例中我只想知道从2010年11月10日到2010年11月20日这段时间的9:00到21:00之间的小时和分钟。我不知道如何在Oracle SQL中做到这一点 - 请您解释一下如何做到这一点?

4 个答案:

答案 0 :(得分:1)

这是最后的总和

select
    trunc(Mi/60) || ':' || right('0' || mod(Mi,60), 2) Total
from
(
    select sum
    (
        (
        case when endtime-trunc(endtime) > 21.0/24 then 21.0/24 else endtime-trunc(endtime) end
        -
        case when starttime-trunc(starttime) < 9.0/24 then 9.0/24 else starttime-trunc(starttime) end
        ) * 24 * 60
    ) Mi
    from tbl
    where starttime >= to_date('10-Nov-2010')
      and endtime < to_date('20-Nov-2010') + 1
) M

答案 1 :(得分:0)

你将如何手工完成?

  • 您需要确定当天结束时间的最短(较早)和当天21:00以确定结束点。
  • 您需要确定当天的开始时间的最大值(稍后)以及确定起点的那天的09:00。
  • 这两个值之间的差异就是您想要的时间。

将其简化为SQL需要了解Oracle的时间操作函数 - 这是每个DBMS都有自己的一组特殊功能和规则的区域之一,并且在一个上运行的内容不一定适用于任何其他功能和规则。

答案 2 :(得分:0)

试试这个:

SELECT  componentid,
    starttime,
    endtime,
    (
     CASE WHEN (endtime> TRUNC(endtime+ 21/24)) THEN TRUNC(endtime+ 21/24)  ELSE endtime  END - 
     CASE WHEN (starttime< TRUNC(endtime+ 9/24)) THEN TRUNC(starttime+ 9/24)   ELSE starttime END
    )*24  result    
  FROM <YOURTABLE>

答案 3 :(得分:0)

为了提供另一种做时间算术的方法,我将使用带间隔算术的视图。 (PostgreSQL,而不是Oracle。)

CREATE VIEW experimental_time_diffs AS 
 SELECT component_id, start_time, end_time, 
   case when cast(end_time as time) > '21:00'
        then date_trunc('day', end_time) + interval '21' hour else end_time end - 
   case when cast(start_time as time) < '9:00'
        then date_trunc('day', start_time) + interval '9' hour else start_time end
   AS adj_elapsed_time
   FROM your_table;

你可以对视图的列“adj_elapsed_time”求和。

select sum(adj_elapsed_time) as total_elapsed_time 
from experimental_time_diffs;