2017-07-21 214 views
0

如何在Oracle SQL中解决此问题?在日期日期时间范围内查找“多日”日期时间范围内的部分

1.I具有列Event_Min_DateTime(如2017年1月6日7时30分00秒)& Event_Max_datetime(如2017年3月6日十八时三十分00秒)的的EVENT_ID(例如ev001)。因此,计算列Event_minutes可以创建为(Event_Max_datetime - Event_Min_DateTime)* 24 * 60。

  • 我也有列Daily_Window_Start一个Daily_Date(按顺序每一天)的(可变的时间戳值)和Daily_Window_End(可变时间戳值)。因此计算列Daily_Window_minutes可以计算为(Daily_Window_End-Daily_Window_Start)* 24 * 60。请注意,Daily_Window_minutes将始终为< = 1440。
  • 现在,如何计算列Daily_portion_withinDaily_portion_outside(所述Event_minutes落入内Daily_Window_minutes的部分)(在Event_minutes的一部分落下以外Daily_Window_minutes但相同内Daily_Date)?

    回答

    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) 
    
    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