【问题标题】:How to get start date and end date from the given date column according to task completion in a day (oracle)如何根据一天中的任务完成情况从给定日期列中获取开始日期和结束日期(oracle)
【发布时间】:2017-08-02 06:34:57
【问题描述】:

这里在dummy data中,你可以看到有两列Task_CompletionTime_stamp。有一个java scheduler在任务完成时运行,例如scheduler在 15-FEB-2016 上运行 5 次,并且仅在 17-FEB 上运行所以我想要一个查询来计算给定列 time_stamp

Task_Completion                     Time_stamp
true                     15-FEB-16 11.37.56.013000000 AM
true                     15-FEB-16 11.42.55.593000000 AM
true                     15-FEB-16 11.47.48.970000000 AM
true                     15-FEB-16 12.21.57.587000000 PM
true                     15-FEB-16 12.26.55.767000000 PM 
true                     17-FEB-16 10.24.03.320000000 PM
true                     18-FEB-16 10.19.04.333000000 PM

所以输出一定是这样的

       start_time                                      end_time
15-FEB-16 11.37.56.013000000 AM          15-FEB-16 11.47.48.970000000 AM
15-FEB-16 12.21.57.587000000 PM          15-FEB-16 12.26.55.767000000 PM 
17-FEB-16 10.21.33.320000000 PM          17-FEB-16 10.26.33.320000000 PM
18-FEB-16 10.16.33.333000000 PM          18-FEB-16 10.21.33.333000000 PM

有两个条件

条件 1. 如果在 time_stamp 中有 0-5 分钟 间隔,例如在 2 月 15 日那么 start_time 将是 11.37.56.013000000 并且 end_time 将是 11.47.48.970000000 但如果没有,那么再次检查当天是否有任何时间表运行,例如 2 月 15 日 12.21.57.587000000(start_time) 和 12.26.55.767000000(end_time)

condition2. 如果计划一天只运行一次,则平均该 time_stamp 并从该时间开始添加/减去 2.30 分钟(即) 无需再次检查

举例

2 月 17 日 10.21.33.320000000(start_time)10.26.33.320000000(end_time) 与 2 月 18 日相同

所以我的逻辑是,将条件 1 和条件 2 合并,这就是我最终的结果......

--------------------condition2-------------------

select count(*), min(time_stamp) - interval '150' second start_date, max(time_stamp) + interval '150' second end_date
from serverstatus 
group by to_char(time_stamp,'dd-mon-yy')
having count(*)=1
UNION ALL

------------condition1 query--------------------------

我需要 Condition1 查询

【问题讨论】:

    标签: sql oracle


    【解决方案1】:
    SELECT start_time - CASE num_grp_per_day
                          WHEN 1
                          THEN INTERVAL '150' SECOND
                          ELSE INTERVAL '0' SECOND
                        END AS start_time,
           end_time   + CASE num_grp_per_day
                          WHEN 1
                          THEN INTERVAL '150' SECOND
                          ELSE INTERVAL '0' SECOND
                        END AS end_time
    FROM   (
      SELECT DISTINCT
             MIN( time_stamp ) OVER ( PARTITION BY grp ) AS start_time,
             MAX( time_stamp ) OVER ( PARTITION BY grp ) AS end_time,
             COUNT( DISTINCT grp ) OVER ( PARTITION BY TRUNC( time_stamp ) ) AS num_grp_per_day
      FROM   (
        SELECT time_stamp,
               SUM( diff ) OVER ( ORDER BY time_stamp ) AS grp
        FROM   (
          SELECT time_stamp,
                 CASE
                   WHEN time_stamp - LAG( time_stamp ) OVER ( ORDER BY time_stamp )
                          <= INTERVAL '5' MINUTE
                   THEN 0
                   ELSE 1
                 END AS diff
          FROM   your_table
        )
      )
    )
    ORDER BY start_time;
    

    或者,如果您只想将所有零宽度组扩展到 5 分钟间隔(而不仅仅是每天有一个时),那么:

    SELECT MIN( time_stamp ) - CASE COUNT(*)
                                 WHEN 1
                                 THEN INTERVAL '150' SECOND
                                 ELSE INTERVAL '0' SECOND
                               END AS start_time,
           MAX( time_stamp ) + CASE COUNT(*)
                                 WHEN 1
                                 THEN INTERVAL '150' SECOND
                                 ELSE INTERVAL '0' SECOND
                               END AS end_time
    FROM   (
      SELECT time_stamp,
             SUM( diff ) OVER ( ORDER BY time_stamp ) AS grp
      FROM   (
        SELECT time_stamp,
               CASE
                 WHEN time_stamp - LAG( time_stamp ) OVER ( ORDER BY time_stamp )
                        <= INTERVAL '5' MINUTE
                 THEN 0
                 ELSE 1
               END AS diff
        FROM   your_table
      )
    )
    GROUP BY grp;
    

    【讨论】:

    • 请原谅(我正在更新我的查询),但是如果一天中有多个计划运行且时间间隔大于 5 怎么办。那么条件 2 可能会失败。 示例: 在 2016 年 2 月 17 日,计划在 10:24:03 和 11:30:03 运行两次,在 2016 年 2 月 18 日运行 3 次......我理解你的逻辑但如果发生这种情况,则无法更改。
    • 根据您问题中的逻辑 - 条件 2 仅在计划每天运行一次时有效;如果计划每天运行多次,间隔超过 5 分钟,则查询应返回每个组,如果只有一个条目,则开始时间和结束时间将相同 - 这符合您的条件 2。如果这不是您想要的,那么您可能需要澄清条件 2 以使您的要求更加明确。
    • 好的,再次感谢...真的你的逻辑是无与伦比的☺但是我的问题有一点更新,我明天会发布...希望你能回答:)
    • 嗨,请访问此链接我已重新发布我更新的问题stackoverflow.com/questions/45479694/…
    猜你喜欢
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    相关资源
    最近更新 更多