【问题标题】:How to get the Duration with Postgresql如何使用 Postgresql 获取持续时间
【发布时间】:2019-02-20 08:20:49
【问题描述】:

需要帮助如何使用 PostgreSQL 计算持续时间。在下面的示例中,假设一个人的位置是在特定时间记录的。

timestamp        location   
02JAN19:00:00:00 home
02JAN19:05:00:00 work1
02JAN19:06:00:00 work2
02JAN19:07:00:00 home

我只想保留此人第一次不在家庭位置的时间,以及此人在家庭位置以外的持续时间。此人从 05:00 到 06:59 AM 在家外,这是我们要计算的持续时间。

因此,结果数据集如下:

timestamp location duration (in Minutes)
02JAN19:06:00:00 work2    119

【问题讨论】:

    标签: postgresql duration


    【解决方案1】:

    如果你想提取最长在家时间和最短不在家时间的差异,你可以使用

    max(case when location  = 'home' then  timestamp end ) 
         - min(case when location != 'home' then timestamp end )
    
    
    
    
    SELECT extract(epoch FROM max(
         CASE
              WHEN location = 'home' THEN TIMESTAMP
         END
    ) - min(
         CASE
              WHEN location != 'home' THEN TIMESTAMP
         END
    ) )::int / 60 - 1 AS duration
     from
    t;
    

    如果您希望在最长持续时间之前的其余列,

    with dur as
    (
    SELECT extract(epoch FROM max(
         CASE
              WHEN location = 'home' THEN TIMESTAMP
         END
    ) - min(
         CASE
              WHEN location != 'home' THEN TIMESTAMP
         END
    ) )::int / 60 - 1 AS duration
     from
    t ) 
    select t.*,dur.duration from t cross join dur 
      order by CASE
              WHEN location != 'home' THEN TIMESTAMP
         END desc nulls last limit 1
    

    如果您想为每个人使用它,您可以使用 GROUP BY person 或任何代表唯一人员的 id,然后使用 DISTINCT ON 过滤掉 最大时间戳而不是 ORDER BYLIMIT

    Demo

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 2020-09-02
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 2022-10-15
      • 1970-01-01
      • 2011-04-09
      相关资源
      最近更新 更多