2013-10-23 18 views
0

我正在查看一个数据库表,其中包含大约11PM至上午8点之间运行的一组任务的运行时间记录。一些任务在上午12点之前开始和结束。一些在12点以后开始和结束。其余的开始于12AM之前,12AM之后结束所以,它有点分散。获取与上次运行任务相对应的记录

每天,对应于当天运行的记录是附加到数据库表。在之后创建记录特定任务已完成运行。所以,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降序排序)

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:性能不是一个大问题,因为记录数量不是那么大。

+2

请出示你的表模式和一些示例数据和预期的产出。 – OldProgrammer

+0

@OldProgrammer:完成.. – tumchaaditya

回答

1

好吧,你澄清后,你需要什么,它似乎是不够的获取那些有start_dttm等于每个任务的最新start_date记录,但只有一个任务完成(我假定任务是已完成在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

+0

谢谢你的开头...我认为这不会考虑到案例2.我想,我应该以某种方式在END_DTTM中使用MAX日期,您已使用SYSDATE .. – tumchaaditya

+0

@tumchaaditya I'我编辑了我的答案。 –

+0

尚未完成的任务没有记录...仅在任务完成后创建记录... 我想到了我们的解决方法....我创建了一个具有特殊任务名称的记录,当整个事情开始时,我获取任务已经开始dttm超过这个特殊记录...感谢您的帮助,虽然... – tumchaaditya

相关问题