0

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

每天,对应于当天运行的记录都会附加到数据库表中。在特定任务完成运行创建记录。因此,1 条记录 = 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 运行。预期结果:TASK1
查询在 10 月 22 日凌晨 4:00 运行。预期结果:TASK1、TASK2

PS:性能不是一个大问题,因为记录的数量不是那么大。

4

1 回答 1

1

好的,在你澄清了你需要什么之后,似乎足以为每个任务获取那些start_dttm等于最新的记录start_date,但前提是任务已经完成(我假设完成的任务在 NULL 中具有 NULL end_dttm)。

解决方案:

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

于 2013-10-23T09:29:14.973 回答