0

如何在 Oracle SQL 中解决这个问题?

1.我有Event_ID (例如 ev001)的列Event_Min_DateTime(例如 01/06/2017 7:30:00)和Event_Max_datetime(例如 03/06/2017 18:30:00)。因此,计算列Event_minutes可以创建为 ( Event_Max_datetime - Event_Min_DateTime )*24*60。

  1. 我还有 Daily_Date 的列Daily_Window_Start(可变时间戳值)和Daily_Window_End(可变时间戳值)(每天依次)因此,计算列Daily_Window_minutes可以计算为 ( Daily_Window_End - Daily_Window_Start )*24*60。请注意,Daily_Window_minutes将始终 <=1440。

现在,如何计算列Daily_portion_within( Event_minutes 在Daily_Window_minutes 内的部分)和Daily_portion_outside(Event_minutes 在Daily_Window_minutes之外 但在同一个Daily_Date内的部分)?

4

2 回答 2

0

从问题中不清楚 Daily_Window_Start 是否可以 > Event_Min_DateTime,所以在这里我考虑只写那些不是的情况。此外,从您的问题中看不到列的数据类型,并且不应用转换。您可以在 Daily_Window_Start > Event_Min_DateTime 的类似行上编写查询,如下所示。然而,这里有很多假设。

   SELECT
           CASE
                  WHEN e. event_max_datetime <= d.daily_window_end THEN (e.event_max_datetime - e.event_min_datetime)*24*60
                  ELSE (d.daily_window_end                                                    - e.event_min_datetime)*24*60
           END daily_portion_within ,
           CASE
                  WHEN e. event_max_datetime <= d.daily_window_end THEN NULL
                  ELSE ( e.event_max_datetime - d.daily_window_end)*24*60
           END daily_portion_outside
    FROM   (
                  SELECT Trunc(event_max_datetime) dt ,
                         event_min_datetime ,
                         event_max_datetime
                  FROM   EVENTS ) EVENTS e,
           daily_window d
    WHERE  e.dt = trunc(d.dt) 
于 2017-07-21T14:32:56.613 回答
0

这个例子应该有帮助:

select trunc(d1) as day, inside, (d2 - d1) * 24 * 60 - inside as outside 
  from (select e.*, d.*,
               case when d2 < e1 or e2 < d1 then 0
                    else least(e2, d2) - greatest(e1, d1)
               end * 24 * 60 as inside
          from e cross join d)

数据:

create table e (id number(3), e1 date, e2 date);
insert into e values(1, timestamp '2017-06-01 07:30:00', timestamp '2017-06-03 18:30:00');

create table d (d1 date, d2 date);
insert into d values(timestamp '2017-06-01 06:00:00', timestamp '2017-06-01 15:30:00');
insert into d values(timestamp '2017-06-02 09:30:00', timestamp '2017-06-02 22:30:00');
insert into d values(timestamp '2017-06-03 12:05:00', timestamp '2017-06-03 19:45:00');
insert into d values(timestamp '2017-06-04 15:00:00', timestamp '2017-06-04 16:30:00');

结果:

DAY             INSIDE    OUTSIDE
----------- ---------- ----------
2017-06-01         480         90
2017-06-02         780          0
2017-06-03         385         75
2017-06-04           0         90
于 2017-07-21T15:06:33.400 回答