获取与上次运行任务相对应的记录

时间:2013-10-23 00:30:05

标签: sql oracle oracle11g

我正在查看一个数据库表,其中包含在晚上11点到8点之间运行的一堆任务的运行时间记录。有些任务在上午12点之前开始和结束。有些在12 AM之后开始和结束。剩下的时间在上午12点之前开始,在上午12点之后结束所以,它有点分散。

每天,与当天运行相对应的记录追加到数据库表。在特定任务完成运行之后创建记录。因此,1记录= 1次特定任务的运行 表中的一些字段是任务名称,开始日期时间,结束日期时间等。

现在,我想获取与每个任务的最后一天的相对应的记录。所以,如果一个特定的任务确实在昨天晚上说,我希望从前天开始记录。此外,如果我在凌晨3点醒来,当一半任务完成运行时,我只想要与当前运行相对应的记录。

我该如何解决?

到目前为止我尝试了什么:
一堆东​​西。我来的关闭是检查开始日期和结束日期是否在当前日期的1天内。但是,这也将考虑到昨天完成的任务 基本上,我无法弄清楚逻辑,因为它涉及具有不同日期的任务。

以下是一些示例数据:
案例1:昨天的任务:

  TASK_NAME          START_DTTM             END_DTTM
    TASK1          10/21/2013 11:21 PM    10/21/2013 11:58 PM
    TASK2          10/21/2013 11:30 PM    10/22/2013 03:58 AM
    TASK3          10/22/2013 12:33 AM    10/22/2013 07:58 AM

在所有任务完成运行后的10/22上午运行查询。预期结果:所有任务。

案例2:昨天没有运行任务(比如表格按END_DTTM DESC排序)

   TASK_NAME          START_DTTM             END_DTTM
    TASK1          10/21/2013 11:21 PM    10/21/2013 11:58 PM
    TASK2          10/21/2013 11:30 PM    10/22/2013 03:58 AM
    TASK3          10/22/2013 12:33 AM    10/22/2013 07:58 AM

查询在10月23日上午运行。预期结果:所有任务(因为没有任务在10月22日晚上和10月23日凌晨运行)

案例3:任务正在运行(比如表按END_DTTM DESC排序):

   TASK_NAME          START_DTTM             END_DTTM
    TASK1          10/21/2013 11:21 PM    10/21/2013 11:58 PM
    TASK2          10/21/2013 11:30 PM    10/22/2013 03:58 AM
    TASK3          10/22/2013 12:33 AM    10/22/2013 07:58 AM

查询在10/22 3:00 AM运行。预期结果:TASK1
查询在10/22 4:00 AM运行。预期结果:TASK1,TASK2

PS:由于记录数量不是很大,因此性能不是一个大问题。

1 个答案:

答案 0 :(得分:1)

好的,在你澄清了你需要的内容后,似乎足以获取每个任务start_dttm等于最新start_date的记录,但只有在任务完成时才会这样(I假设完成的任务在end_dttm)中为NULL。

解决方案:

CREATE TABLE tasks (
  task_name VARCHAR2(20),
  start_dttm DATE,
  end_dttm DATE
);

INSERT INTO tasks VALUES ('TASK1', TO_DATE('10/21/2013 23:21', 'MM/DD/YYYY HH24:MI'), TO_DATE('10/21/2013 23:58', 'MM/DD/YYYY HH24:MI'));
INSERT INTO tasks VALUES ('TASK2', TO_DATE('10/21/2013 23:30', 'MM/DD/YYYY HH24:MI'), TO_DATE('10/22/2013 03:58', 'MM/DD/YYYY HH24:MI'));
INSERT INTO tasks VALUES ('TASK3', TO_DATE('10/22/2013 00:33', 'MM/DD/YYYY HH24:MI'), TO_DATE('10/22/2013 07:58', 'MM/DD/YYYY HH24:MI'));

COMMIT;

SELECT task_name, start_dttm, end_dttm
  FROM tasks
WHERE (task_name, start_dttm) IN (
                      SELECT task_name, MAX(start_dttm)
                        FROM tasks
                      WHERE end_dttm IS NOT NULL
                      GROUP BY task_name
  )
;

检查SQLFiddle: SQLFiddle demo