使用两个日期/时间戳列计算pod的总运行时间

66bbxpm5  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(411)

我目前正在postgresql数据库中存储所有的pod。我通过created\u time和deleted\u time列跟踪每个pod的创建和删除。当pod未被删除时,其已删除的时间列将保持为空。
sqlfiddle可以在这里找到:sqlfiddle
下面给出了该模式以供快速参考:

  1. create table pods (
  2. name text primary key,
  3. created_time timestamp without time zone,
  4. deleted_time timestamp without time zone default null
  5. );
  6. insert into pods (name, created_time)
  7. values
  8. ('pod-1', '02-01-2020 01:00:00'),
  9. ('pod-2', '02-01-2020 02:00:00');
  10. update pods set deleted_time = '02-01-2020 03:00:00' where name = 'pod-1';

计算运行时间时面临的挑战如下:
处理空时间列(pod仍在运行)
将创建的\u时间和删除的\u时间剪裁到用户给定的范围(开始和结束时间)。
所以我提出了下面的查询,它可以计算使用小时数,但是当您处理给定日期范围内的数百万个pod时,它有点慢。

  1. -- end_time = '2020-02-01 04:00:00'
  2. -- start_time = '2020-02-01 02:00:00'
  3. with model as (
  4. select
  5. name,
  6. case when created_time < '2020-02-01 02:00:00' then '2020-02-01 02:00:00' else created_time end as created_time,
  7. coalesce(
  8. case when deleted_time >= created_time and deleted_time <= '2020-02-01 04:00:00' then deleted_time else null end,
  9. '2020-02-01 04:00:00'
  10. ) as deleted_time,
  11. extract(
  12. epoch from(
  13. coalesce(
  14. case when deleted_time >= created_time and deleted_time <= '2020-02-01 04:00:00' then deleted_time else null end, '2020-02-01 04:00:00'
  15. ) - case when created_time < '2020-02-01 02:00:00' then '2020-02-01 02:00:00' else created_time end)) / 3600::float as usage_hours
  16. from pods
  17. where created_time <= '2020-02-01 04:00:00' and
  18. (deleted_time is null or deleted_time >= '2020-02-01 02:00:00')
  19. )
  20. select sum(usage_hours) from model; -- should return 3.

所以我的问题是:我想知道是否有任何有效的方法来计算这些统计数据?。或者甚至可以用给定的模式来计算它?

jqjz2hbq

jqjz2hbq1#

总体逻辑在我看来不错。
你可以简化一下 least() , greatest() , coalesce() ,以及更简单的日期算法:

  1. select
  2. sum(extract(epoch from
  3. least('2020-02-01 04:00:00', coalesce(deleted_time, '2020-02-01 04:00:00'))
  4. - greatest('2020-02-01 02:00:00', created_time)
  5. )) / 60.0 / 60 usage_hours
  6. from pods
  7. where
  8. created_time <= '2020-02-01 04:00:00' and
  9. (deleted_time is null or deleted_time >= '2020-02-01 02:00:00')

相关问题