寻找“多日”的部分内容。日期时间范围落在每日日期时间变量范围内/之外

时间:2017-07-21 13:10:10

标签: oracle datetime plsql sql-timestamp

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

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

  1. 我还有 Daily_Date Daily_Window_Start (变量TimeStamp值)和 Daily_Window_End (变量TimeStamp值)列(按顺序每天)。因此,计算后的列 Daily_Window_minutes 可以计算为( Daily_Window_End - Daily_Window_Start )* 24 * 60。请注意, Daily_Window_minutes 将始终为< = 1440。
  2. 现在,如何计算列 Daily_portion_within Event_minutes 的一部分属于 Daily_Window_minutes )和 Daily_portion_outside Event_minutes 的一部分超出 Daily_Window_minutes 但在同一 Daily_Date 内)?

2 个答案:

答案 0 :(得分: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) 

答案 1 :(得分: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