【问题标题】:SQL - Find time duration duration with only eventstarttime (query)SQL - 仅使用 eventstarttime 查找持续时间(查询)
【发布时间】:2015-05-21 17:33:39
【问题描述】:

我想弄清楚如何查询事件之间的持续时间。我正在查看的表称为 agentstatedetail。为简单起见,表格中有 2 列,agentideventdatetime。该表列出了 agentid 和事件开始日期和时间。在每个事件之后,都会记录一个带有新事件日期和时间的新事件。我正在尝试从与同一代理匹配的先前 eventdatetime 中减去最新的 eventdatetime。我无法粘贴表格的图片,因为我是新手,但我已经粘贴了我处理过的代码。谢谢,希望有人能帮忙!!!

我尝试了 2 个查询示例,但它们不起作用。注意:这是在 SQL Informix 中,但我不在乎是否有人可以阐明,即使它在 MySQL 中。

select  asd1.*, asd2.* from agentstatedetail asd1
 join agentstatedetail asd2 
on asd1.agentid=asd2.agentid
 and asd1.eventdatetime < asd2.eventdatetime
and 0=(select count(*) from agentstatedetail asd3
    where asd3.agentid =asd1.agentid
        and asd3.eventdatetime between asd1.eventdatetime and asd2.eventdatetime
)
where asd1.eventdatetime BETWEEN '2015-5-1 13:00:00' AND '2015-5-2    13:00:00'
and asd2.eventdatetime BETWEEN '2015-5-1 13:00:00' AND '2015-5-2 13:00:00'
and asd1.agentid=1953 


select  asd1.*, asd2.* 
from agentstatedetail asd1
join agentstatedetail asd2 
on asd1.agentid=asd2.agentid
and asd1.eventdatetime < asd2.eventdatetime

left join agentstatedetail asd3
on asd3.agentid =asd1.agentid
    and asd3.eventdatetime between asd1.eventdatetime and       asd2.eventdatetime
where asd1.eventdatetime BETWEEN '2015-5-1 13:00:00' AND '2015-5-2 13:00:00'

 and asd1.agentid=1953 
and asd3.agentid is null

【问题讨论】:

    标签: sql informix duration


    【解决方案1】:
    Select b.agentId, 
       b.eventdatetime start,
       e.eventdatetime end,
       e.eventdatetime - b.eventdatetime ElapsedTime
    From agentstatedetail b
        left join agentstatedetail e
             on e.agentid = b.agentid
                and e.eventdatetime =
                    (Select Min(eventdatetime)
                     from agentstatedetail 
                     where agented = b.agentid
                         and eventdatetime > b.eventdatetime)
    

    【讨论】:

    • 我尝试使用该代码,但我认为我做的不正确。这是你的意思吗?选择 asd1.agentid,asd1.eventdatetime 作为开始时间,asd2.eventdatetime 作为结束时间,asd2.eventdatetime - asd1.eventdatetime 作为经过时间从 agentstatedetail asd1 离开加入 agentstatedetail asd2 on asd1.agentid=asd2.agentid 和 asd2。 eventdatetime = (select min(eventdatetime) from agentstatedetail where agentid = asd1.agentid and eventdatetime > asd1.eventdatetime)
    • 是的,我使用表别名b 开始,e 结束,输出列别名start 开始时间,End 结束时间,SQL 关键字AS是可选的,否则,你所拥有的似乎是一样的......
    • 您从查询中看到了什么行为?
    • 感谢您的帮助。我得到一个未知的 SQL 类型 110,但不确定这意味着什么。我知道它是一种描述符类型,但不确定在我的代码中查看的位置。
    • 这可能是 Informix 特有的问题,很抱歉,但我不了解 Informix,因此无法为您提供帮助。
    【解决方案2】:

    选择 asd1.agentid, asd1.eventtype, asd2.eventdatetime, asd1.eventdatetime, ((asd2.eventdatetime-asd1.eventdatetime)::interval minute(9) to minute::char(10)::int) 作为 IntervalMinutes, ((asd2.eventdatetime-asd1.eventdatetime)::interval second(9) to second::char(10)::int) 作为间隔

    来自agentstatedetail asd1 加入代理statedetail asd2 关于 asd1.agentid=asd2.agentid 和 asd2.eventdatetime = (select min(eventdatetime) 来自agentstatedetail 其中agentid = asd1.agentid 和 eventdatetime > asd1.eventdatetime) 其中 asd1.agentid=1953 和 asd1.eventdatetime 在“2015-5-1 13:00:00”和“2015-5-2 13:00:00”之间

    【讨论】:

    • @Charles Bretana,所以我运行了查询,但我遇到的一个问题是,当有一个 eventdatetime 与下一个 eventdatetime 相同的时间(0 持续时间)时。由于我正在运行的子查询仅采用 eventdatetime>asd1.eventdatetime ,因此在数据中产生了一些带有重复条目的噪音。当我说 eventdatetime>=asd1.eventdatetime 时,开始时间和结束时间是相同的。有什么建议么?谢谢!
    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多