Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取与上次运行的任务相对应的记录_Sql_Oracle_Oracle11g - Fatal编程技术网

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

Sql 获取与上次运行的任务相对应的记录,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我正在查看一个数据库表,其中包含在晚上11点到早上8点之间运行的一系列任务的运行时间记录。有些任务在上午12点之前开始和结束。有些在上午12点后开始和结束。剩下的在12点之前开始,12点之后结束,所以有点分散 每天,与当天运行相对应的记录都会添加到数据库表中。这些记录是在特定任务完成运行后创建的。因此,1条记录=1个特定任务的1次运行。 表中的一些字段是任务名称、开始日期时间、结束日期时间等 现在,我想获取与每个任务的最后一天运行的对应的记录。因此,如果某个特定任务确实在昨天晚上运行,那么我不想

我正在查看一个数据库表,其中包含在晚上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\u DTTM DESC排序)

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

案例3:任务正在运行(假设表格按END\u 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运行。预期结果:任务1
查询在10/22 4:00AM运行。预期结果:任务1、任务2


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

好的,在您澄清了您需要什么之后,似乎足够获取每个任务的
start\u dttm
等于最新
start\u日期的记录,但前提是任务已经完成(我假设未完成的任务在
end\u 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
  )
;

检查SQLFIDLE:

请显示您的表架构和一些示例数据以及预期的输出。@OldProgrammer:完成..感谢您的启动…我认为这不会考虑案例2。我想,我应该在您使用SYSDATE的地方使用MAX date from END_DTTM..未完成的任务没有记录…仅创建记录任务完成后…我想出了一个解决办法…当整个任务开始时,我用一个特殊的任务名称创建了一个记录,并且我获取了启动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
  )
;