table 中所有行的 PostgreSQL 函数

PostgreSQL function for all rows in table

我有一个 table(称为 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. 从纪元中减去(纪元 % 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;

这个returns

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

这是正确的,但不是对所有行。换句话说,它只有 returns 一行,即使我有多行具有明显不同的时间戳的不同时间间隔。我的想法是该函数计算第一个时间戳的纪元间隔,因此我只得到一个结果。我应该如何确保函数对每一行都进行计算?

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

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

Table 输入 (table: 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

它没有回答问题,但是按照代码逻辑,你可以

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

完全没有功能