【问题标题】:Calculating time with datetime values使用日期时间值计算时间
【发布时间】:2020-04-01 20:08:30
【问题描述】:

我有两张表,一张有任务,另一张有动作。在任务表中,我有具有 ID、开始日期(任务创建时间)和结束日期(任务关闭时间)的任务。在操作表中,我有在任务表中完成的操作,因此它具有 ID、task_ID、action_ID 和操作时间。 我想计算关闭任务所需的时间(结束日期 - 开始日期),但由于有可能暂停任务,所以我想排除暂停时间。 例如:

动作表:

ID      TASK_ID   ACTION_ID          TIME  
 1       2593         1              2020-03-25 07:05:48.000           
 2       2593         11             2020-03-25 11:05:48.000     
 3       2593         22             2020-03-25 20:05:48.000     
 4       2593         11             2020-03-26 07:05:48.000     
 5       2593         22             2020-03-27 07:04:31.000
 6       2593         2              2020-03-27 15:04:31.000    

任务 ID 是指任务表。 Action ID 1 表示任务已打开,11 表示任务已暂停,22 表示暂停已取消,2 表示任务已完成/关闭。 因此,在示例中,任务暂停了两次,我想计算从开始 (ID 1) 到结束 (ID 2) 的时间,但不包括暂停时间(ID 11 和 22 之间的时间)。

最好的方法是什么?

谢谢。

【问题讨论】:

  • 我似乎无法理解您喜欢用这些表格做什么。是否需要计算多次来的同一个task_id的记录之间的时间差?
  • 我改变了时代,所以现在应该更好理解。一个任务 ID 有多个动作(例如暂停)。我想计算完成/关闭任务所花费的时间,即操作 ID 1 和 ID 2 之间的时间,但从总时间中减去暂停时间(ID 11 和 22 之间)。如果任务被多次暂停,那么它应该减去所有这些暂停,如示例中所示。

标签: sql sql-server


【解决方案1】:

假设值正确交错,您可以使用lead() 获取下一个值。然后,您只需添加操作 1 和 22 的时间。

select t.task_id,
       sum(datediff(second, time, next_time)) as total_time
from (select t.*, lead(time) over (partition by task_id order by time) as next_time
      from t
      where action_id in (1, 11, 22, 2)
     ) t
where action_id in (1, 22)
group by task_id;

Here 是一个 dbfiddle。

【讨论】:

  • 谢谢,它似乎工作了。但是如何从任务表中获取开始和结束日期以及从操作表中获取暂停时间?因为我注意到可能有一些任务在开始或结束时具有不同的 action_id,但任务表具有正确的开始日期和结束日期。再次感谢。
  • 或者从动作表中获取开始和结束日期,但不管它们的 action_id 是什么。
  • @Censoreb 。 . .根据您的问题,您的操作表有开始、停止和暂停。如果您想包含两个表,我建议您提出一个 问题,其中包含来自两个 表的示例数据以及对逻辑的清晰解释。
  • 它不必包含两个表。可以将第一个action_id作为开始日期,最后一个作为结束日期,暂停ID保持不变。
猜你喜欢
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 2010-09-17
  • 2011-09-24
  • 2014-03-04
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多