PostgreSQL函数用于表中的所有行

问题描述 投票:0回答:1

我有一个表(称为time_table),其中有一个名为“time”的列。此列的时间戳格式如下:2017-07-31 09:08:42

换句话说:YYYY-MM-DD HH:MM:SS

我想将所有这些时间戳划分为五分钟的间隔。所以,例如,09:00:00是一个间隔,09:05:00是另一个。因此,上面的例子将放在2017-07-31 09:05:00区间。

我这样做的计划如下:

  1. 将时间戳转换为纪元时间
  2. 计算纪元%300
  3. 从epoch中减去(epoch%300)

例:

2017-07-31 09:08:42在纪元是1501492122。

1501492122 % 300 = 222

1501492122 - 222 = 1501491900

1501491900转换为2017-07-31 09:05:00那是我的间隔。

我试图在PostgreSQL中这样做。我认为创建一个函数是最简单的。第一步可以计算

select extract('epoch' from time) from time_table

这将时间戳正确地转换为时代。但是我把所有东西都放在一个功能上有问题。现在我已经实现了以下内容:

create or replace function stamp_to_epoch() returns table (epoch_mod integer) as $$
declare
epoch integer;
epoch_mod integer;
begin
select extract('epoch' from time) from time_table into epoch;
select (epoch % 300) into epoch_mod;
return query select (epoch - epoch_mod);
end;
$$ language plpgsql;

这回来了

stamp_to_epoch
----------------
    1501491900 
(1 row)

哪个是正确的,但不适用于所有行。换句话说,即使我有多个具有不同时间戳的行以显着不同的间隔,它也只返回一行。我的想法是函数计算第一个时间戳的纪元间隔,因此我只得到一个结果。我该如何确保函数为每一行计算这个?

我发现很难理解documentation这可能就是我遇到这个问题的原因。我已经搜索过,但认为很难找到我正在寻找的东西。

编辑:我被要求包括表输入和预期输出。

表输入(表:time_table):

 time         
----------------------
 2017-05-09 05:08:42 
 2017-05-10 05:16:24
 2017-07-31 09:08:42

预期产量:

 time         
----------------------
 2017-05-09 05:05:00 
 2017-05-10 05:15:00
 2017-07-31 09:05:00
sql postgresql date time plpgsql
1个回答
1
投票

它没有回答这个问题,但是遵循代码逻辑,你可以做到

select extract('epoch' from time) - (extract('epoch' from time) % 300) 
from time_table

根本没有任何功能

© www.soinside.com 2019 - 2024. All rights reserved.