我目前正在postgresql数据库中存储所有的pod。我通过created\u time和deleted\u time列跟踪每个pod的创建和删除。当pod未被删除时,其已删除的时间列将保持为空。
sqlfiddle可以在这里找到:sqlfiddle
下面给出了该模式以供快速参考:
create table pods (
name text primary key,
created_time timestamp without time zone,
deleted_time timestamp without time zone default null
);
insert into pods (name, created_time)
values
('pod-1', '02-01-2020 01:00:00'),
('pod-2', '02-01-2020 02:00:00');
update pods set deleted_time = '02-01-2020 03:00:00' where name = 'pod-1';
计算运行时间时面临的挑战如下:
处理空时间列(pod仍在运行)
将创建的\u时间和删除的\u时间剪裁到用户给定的范围(开始和结束时间)。
所以我提出了下面的查询,它可以计算使用小时数,但是当您处理给定日期范围内的数百万个pod时,它有点慢。
-- end_time = '2020-02-01 04:00:00'
-- start_time = '2020-02-01 02:00:00'
with model as (
select
name,
case when created_time < '2020-02-01 02:00:00' then '2020-02-01 02:00:00' else created_time end as created_time,
coalesce(
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'
) as deleted_time,
extract(
epoch from(
coalesce(
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'
) - 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
from pods
where created_time <= '2020-02-01 04:00:00' and
(deleted_time is null or deleted_time >= '2020-02-01 02:00:00')
)
select sum(usage_hours) from model; -- should return 3.
所以我的问题是:我想知道是否有任何有效的方法来计算这些统计数据?。或者甚至可以用给定的模式来计算它?
1条答案
按热度按时间jqjz2hbq1#
总体逻辑在我看来不错。
你可以简化一下
least()
,greatest()
,coalesce()
,以及更简单的日期算法: