【发布时间】:2018-01-06 16:51:08
【问题描述】:
我有一个表(称为 time_table),其中有一列称为“时间”。此列具有以下格式的时间戳: 2017-07-31 09:08:42
换句话说: YYYY-MM-DD HH:MM:SS
我想将所有这些时间戳划分为五分钟的间隔。因此,例如,09:00:00 是一个间隔,09:05:00 是另一个。因此,上面的示例将放置在 2017-07-31 09:05:00 时间间隔内。
我的计划如下:
- 将时间戳转换为纪元时间
- 计算 epoch % 300
- 从纪元中减去(纪元 % 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
【问题讨论】:
-
请包含您的表格输入数据和预期输出。
-
为什么不
select extract('epoch' from time) - (extract('epoch' from time) % 300) from time_table?.. -
@VaoTsun 你是绝对正确的。有时大脑并没有考虑用简单的方法来解决它。谢谢,这完美。不能真正给你的评论一个“正确的答案”,但如果可以的话,我会的。
-
@hokosha 我把它作为答案,尽管它更适合作为解决方案:)
-
问题是您正在函数中进行查询。您应该向函数添加一个参数(原始 time_stamp)并将其用于转换。然后,您可以使用每行的相关时间戳调用该函数。
标签: sql postgresql date time plpgsql