【问题标题】:get time series in 10 minutes of interval以 10 分钟的间隔获取时间序列
【发布时间】:2022-01-15 02:28:06
【问题描述】:

我正在使用以下查询生成一个时间序列。

SELECT date_trunc('min', dd):: TIMESTAMP WITHOUT TIME zone as time_ent 
FROM generate_series ( timestamp '2021-12-09 06:34:37' + ((DATE_PART('min', timestamp '2021-12-09 06:34:37')::integer % 2) || ' minutes') :: INTERVAL 
, '2021-12-10 06:34:37'::timestamp 
, '20 min'::interval) dd

它会给我如下输出。

2021-12-09 06:34:00.000
2021-12-09 06:54:00.000
2021-12-09 07:14:00.000
2021-12-09 07:34:00.000

但我需要类似的输出。

2021-12-09 06:40:00.000
2021-12-09 07:00:00.000
2021-12-09 07:20:00.000
2021-12-09 07:40:00.000

目前,时间序列小时数取决于我通过的时间戳。在上面它给了我像 34,54,14 这样的分钟......但我想要像 40,00,20 这样的分钟......它不应该取决于我通过查询的时间。我尝试使用 timestamp '2021-12-09 06:34:37' + ((DATE_PART('min', timestamp '2021-12-09 06:34:37')::integer % 2) || 'minutes') :: INTERVAL 但没有成功。

【问题讨论】:

  • 您能描述一下您的具体要求吗?如果输出不应该依赖于您传递的输入,为什么它应该从2021-12-09 06:40:00.000 生成系列?
  • 因为输入是当前时间戳,但我需要当前时间戳之后的时间序列,如 0,20,40 间隔

标签: sql postgresql


【解决方案1】:

根据您的描述,我假设您要创建一系列时间戳,分别为每小时 00、20、40 分钟,直到第二天。

select * 
from (
    select date_trunc('hour', current_timestamp) + i * interval '20 minutes' as ts
    from generate_series(1, 24*3) as t(i)) t
where ts between current_timestamp and current_timestamp + interval '1 day'

这里的关键思想是首先将current_timestamp 截断为00 minute。这成为系列的开始。然后过滤掉你想要的范围之外的生成时间戳。您可能需要调整 generate_series 函数的第二个参数,具体取决于您的要求。

或者您可以只生成一系列时间戳,如下所示:

select *
from (
    select ts
    from generate_series(
      date_trunc('hour', current_timestamp),
      current_timestamp + interval '1 day',
      interval '20 minutes') as t(ts)) as t
where ts between current_timestamp and current_timestamp + interval '1 day'

在这里,您仍然需要先将时间戳截断为小时,以便系列从 00 分钟开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2012-07-23
    • 2022-01-16
    • 2016-10-13
    相关资源
    最近更新 更多