【问题标题】:get time series in even numbers of hours instead of odd numbers of hours以偶数小时而不是奇数小时获得时间序列
【发布时间】:2022-01-14 06:31:33
【问题描述】:

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

SELECT date_trunc('hour', dd):: TIMESTAMP WITHOUT TIME zone as time_ent
FROM generate_series ( '2021-12-02 11:49:26'::timestamp 
                     , '2021-12-09 11:49:26'::timestamp
                     , '120 min'::interval) dd

它会给我如下输出。

2021-12-02 11:00:00.000
2021-12-02 13:00:00.000
2021-12-02 15:00:00.000
2021-12-02 17:00:00.000
2021-12-02 19:00:00.000

但我需要类似的输出。

2021-12-02 12:00:00.000
2021-12-02 14:00:00.000
2021-12-02 16:00:00.000
2021-12-02 18:00:00.000
2021-12-02 20:00:00.000

目前,时间序列小时数取决于我通过的时间戳。在上面它给了我像 11,13,15 这样的奇数小时......但我希望在任何情况下像 12,14,16 这样的偶数小时......它不应该取决于我在查询中传递的时间strong>'2021-12-02 11:49:26'::timestamp, '2021-12-09 11:49:26'::timestamp

【问题讨论】:

  • 您使用的是 MySQL 还是 Postgresql? (上述查询不会在两者上运行。)
  • 我正在使用 Postgresql
  • 你有没有想过使用一个函数,它提取小时并获取小时的mod,如果是1,那么它加1,如果是0那么它很好,可以输出。
  • @DivyeshJesadiya 你是说这个吗? dbfiddle.uk/…

标签: sql postgresql


【解决方案1】:

这是根据 Tilen 的评论的解决方案。

SELECT date_trunc('hour', dd):: TIMESTAMP WITHOUT TIME zone as time_ent
FROM generate_series (
        CASE
            WHEN MOD(EXTRACT(HOUR FROM '2021-12-02 11:49:26'::timestamp)::INT, 2) = 0 THEN
                '2021-12-02 11:49:26'::timestamp
            ELSE
                '2021-12-02 11:49:26'::timestamp + INTERVAL '1 hour'
        END
        , '2021-12-09 11:49:26'::timestamp
        , '120 min'::INTERVAL
    ) dd

【讨论】:

    【解决方案2】:
    SELECT date_trunc('hour', dd):: TIMESTAMP WITHOUT TIME zone as time_ent
    FROM generate_series ( timestamp '2021-12-02 11:49:26' + ((DATE_PART('hour', timestamp '2021-12-02 11:49:26')::integer % 2) || ' hours') :: INTERVAL
                         , '2021-12-03 11:49:26'::timestamp
                         , '120 min'::interval) dd
    

    https://dbfiddle.uk/?rdbms=postgres_12&fiddle=6b220fdb1d30c10ca17e8ce07333f5ce

    【讨论】:

    • 如果我将时间从“2021-12-02 11:49:26”更改为“2021-12-02 12:49:26”,它将再次显示奇数时间
    • @DivyeshJesadiya ?? dbfiddle.uk/…也许你只编辑过一个地方?看 - 开始日期时间被使用了两次。
    • 是的,很抱歉这个错误。
    • 如何在此查询中添加 20 分钟的间隔“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"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2021-11-07
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多