我正在查看一个数据库表,其中包含在晚上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:由于记录数量不是很大,因此性能不是一个大问题。
答案 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