2017-07-31 65 views
0

我有一个表(称为time_table),其中有一个名为“time”的列。此列在下面的格式时间戳: 2017年7月31日9时08分42秒PostgreSQL函数表中的所有行

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

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

我的用于执行此操作计划如下:

  1. 转换时间戳信号出现时间
  2. 计算划时代%300
  3. 从历元
  4. 减去(划时代%300)

实施例:

2017-07-31 09:08:42在时代是1501492122.

1501492122%300 = 222

1501492122 - 222 = 1501491900

1501491900被转换为2017年7月31日9时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 
+0

请包含您的表格输入数据和预期输出。 –

+2

为什么不''选择时间提取('epoch') - (从时间表中提取('epoch'from time)%300)? –

+0

@VaoTsun你是完全正确的。有时候大脑并没有考虑以简单的方式解决它。谢谢,那完美的作品。真的不能给你的评论一个“正确的答案”,但如果我可以的话,我会的。 – hokosha

回答

1

它不回答这个问题,但下面的代码逻辑,你可以只

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

根本没有功能