Oracle - 计算时间戳之间的差异大于 1 小时的时间戳

Posted

技术标签:

【中文标题】Oracle - 计算时间戳之间的差异大于 1 小时的时间戳【英文标题】:Oracle - Counting timestamps where difference between timestamps greater than 1 hour 【发布时间】:2012-10-12 14:33:26 【问题描述】:

我有一个包含以下字段的工作日志表:

worklog_id,
agent_name,
ticket_number,
timestamp,
worklog_notes.  

我希望能够计算工作日志条目的数量,如果 agent_nameticket_numbertimestamp(日期)相同,则仅在两个条目之间的时间时才计算工作日志条目大于 1 小时。

示例:John Smith 在工单 12345 上创建了三个工作日志条目。第一个时间戳是“10/11/2012 9:11:44 AM”,第二个时间戳是“10/11/2012 9:36:16 AM”第三个时间戳是“10/11/2012 11:18:20 AM”。在此示例中,我只想将两个工作日志条目归功于代理,因为前两个条目相隔不到一个小时。

我已尝试使用“where”子查询使逻辑工作,但无法使其工作。有人可以提供任何示例吗?谢谢! :)

【问题讨论】:

【参考方案1】:

这能得到你想要的吗?应始终计算给定代理在票证上的第一次进入,之后的进入仅应在自上次进入至少一小时后才计算在内。

select agent_name, ticket_number, count(*) from (
  select agent_name, ticket_number, timestamp,
         lag(timestamp) over
            (partition by agent_name, ticket_number order by timestamp) prev_timestamp
  )
from worklog
where (prev_timestamp is null
       or (timestamp - prev_timestamp) >= interval '1' hour
      )
group by agent_name, ticket_number

我不确定这是否正是您想要的——如果代理在前一个条目后一小时内不断添加条目,则除了第一个条目外,其他条目都不会被计算在内。因此,添加大量更新的人会受到惩罚。

也许您真正想要的是计算进行更新的不同小时数:

select agent_name, ticket_number, count(distinct to_char(timestamp,'DD-MON-YYYY HH24')
  from worklog
  group by agent_name, ticket_number

【讨论】:

非常感谢戴夫!!我选择了你提供的第二个查询,它就像一个冠军!我不知道为什么我从来没有想过格式化时间戳来实现我所需要的......我太过分了,完全错过了最简单的事情! :) [code]select agent "agent_name" ,sum(total_touches) "total_touches" ,sum(distinct_touches) "distinct_touches" from (select a.agent_name as agent ,a.ticket_number as ticket_number ,count(a .worklog_id) as worklog_id ,count(distinct to_char(a.timstamp,'dd-mon-yyyy hh24')) as distinct_touches from worklog a where a.agent_name = 'john smith' and a.ticket_number = 123456 group by a.agent_name ,a.ticket_number) 按代理分组[/code]

以上是关于Oracle - 计算时间戳之间的差异大于 1 小时的时间戳的主要内容,如果未能解决你的问题,请参考以下文章

计算多个时间戳之间的差异

带有 UNIX 时间戳的 MySQL 表 - 按时间戳排序并计算一行与前一行之间的差异

DB2,在尝试计算提供的时间戳和存储的时间戳之间的差异时,出现错误“函数的调用不明确”

以分钟为单位计算两个日期之间的时间差

SQL 获取时间戳差异大于 30 时的 id 计数

使用chrono c++库计算时间戳的差异