【问题标题】:PostgreSQL function for all rows in table表中所有行的PostgreSQL函数
【发布时间】: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 时间间隔内。

我的计划如下:

  1. 将时间戳转换为纪元时间
  2. 计算 epoch % 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;

返回

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


【解决方案1】:

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

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

完全没有功能

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2014-12-15
    • 2012-12-25
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    相关资源
    最近更新 更多