【问题标题】:get time series in 4 days of interval获取间隔 4 天的时间序列
【发布时间】:2022-01-17 00:22:01
【问题描述】:

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

SELECT date_trunc('day', dd):: TIMESTAMP WITHOUT TIME zone as time_ent
FROM generate_series (
    CASE
        WHEN MOD(EXTRACT(DAY FROM '2020-12-13 13:02:42'::timestamp)::INT, 4) = 0 THEN
            '2020-12-13 13:02:42'::date
        ELSE
            '2020-12-13 13:02:42'::date + concat(MOD(EXTRACT(DAY FROM '2020-12-13 13:02:42'::timestamp)::INT, 4), ' day')::interval
    END
    , '2021-12-13 13:02:42'::date
    , '5760 min'::INTERVAL
) dd

它会给我如下输出。

2020-12-14 00:00:00.000
2020-12-18 00:00:00.000
2020-12-22 00:00:00.000
2020-12-26 00:00:00.000
2020-12-30 00:00:00.000
2021-01-03 00:00:00.000

但我需要类似的输出。

2020-12-16 00:00:00.000
2020-12-20 00:00:00.000
2020-12-24 00:00:00.000
2020-12-28 00:00:00.000
2020-01-01 00:00:00.000
2021-01-05 00:00:00.000

目前,时间序列天数取决于我通过的时间戳。在上面它给了我像 14,18,22 这样的日子......但我想要像 16,20,24 这样的日子。 4..days 的倍数不应该取决于我通过查询的时间。我尝试了很多东西,但都没有成功。

【问题讨论】:

  • 嗨,你说“4的倍数”,但从什么时候开始?您还说“天不应该取决于我在查询中传递的时间”,但是它们应该取决于什么?
  • 假设开始日期是“2020-12-13 13:02:42”,那么系列应该从 4 的倍数开始,例如“2020-12-16 00:00:00.000”。 4 的倍数仅用于开始一个系列。不依赖于时间的天数也用于从“2020-12-14 00:00:00.000”开始类似上述查询的系列。因此,它不应依赖于“2020-12-13 13:02:42”,而应从“2020-12-16 00:00:00.000”开始。

标签: sql postgresql


【解决方案1】:

试试这个:

SELECT date_trunc('day', dd):: TIMESTAMP WITHOUT TIME zone as time_ent
FROM generate_series ( date_trunc('month', '2020-12-13 13:02:42' :: timestamp) :: date + (ceiling (EXTRACT(DAY FROM '2020-12-13 13:02:42'::timestamp)/4)*4 - 1) :: integer
                     , '2021-12-13 13:02:42'::date
                     , '4 days' ::INTERVAL
                     ) dd

result

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2022-01-15
    • 2020-01-31
    • 1970-01-01
    • 2022-08-03
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多