时间:2017-07-31 08:04:48

标签: sql postgresql date time plpgsql

我有一个表(称为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%300)
  4. 示例:

    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这可能就是我遇到这个问题的原因。我已经搜索过,但认为很难找到我正在寻找的东西。

    修改 我被要求包括表输入和预期输出。

    表输入(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
    

1 个答案:

答案 0 :(得分:1)

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

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

完全没有任何功能