【问题标题】:How to extract the time from a timestamp without timezone column?如何从没有时区列的时间戳中提取时间?
【发布时间】:2021-01-09 18:37:29
【问题描述】:

我想计算每天每个时间间隔的订单数。

日期的格式是没有时区的时间戳。我似乎无法只提取时间。我每天都使用这个查询,但是有没有办法将一个月中每一天的时间间隔放在一个表中?

CASE WHEN date_created_utc >= timestamp '2020-09-01 08:00:00' AND date_created_utc <= timestamp '2020-09-01 11:00:00' THEN 'Q1'    
WHEN date_created_utc >= timestamp '2020-09-01 11:00:01' AND date_created_utc <= timestamp '2020-09-01 14:00:00' THEN 'Q2'    
WHEN date_created_utc >= timestamp '2020-09-01 14:00:01' AND date_created_utc <= timestamp '2020-09-01 16:00:00' THEN 'Q3'    
WHEN date_created_utc >= timestamp '2020-09-01 16:00:01' AND date_created_utc <= timestamp '2020-09-01 20:00:00' THEN 'Q4'    
WHEN date_created_utc >= timestamp '2020-09-01 20:00:01' AND date_created_utc <= timestamp '2020-09-01 23:59:00' THEN 'Q5'    
END AS interval,    
COUNT(id) as cnt    
FROM order_processing    
GROUP BY 1;

想要的输出表:

Day Q1  Q2  Q3  Q4  Q5
1   28  57  50  65  27
2   23  50  60  90  66
3   58  60  80  70  67

【问题讨论】:

  • “我似乎无法仅提取时间”是什么意思?您为实现这一目标做了什么尝试?
  • 我使用了 ::time。我只是没有把我在这里使用的其他查询。它不适用于 case when,然后我知道那是因为它必须在聚合函数中使用。计数 (*) 过滤器对我来说是新的。

标签: sql postgresql datetime time pivot


【解决方案1】:

您可以转换为time,然后使用比较。对于聚合:

COUNT(*) FILTER (WHERE date_created_utc::time >= '08:00:00' and date_created_utc::time < '11:00:00') as cnt_1
   

【讨论】:

    【解决方案2】:

    你只需要小时部分来实现逻辑:你可以使用extract()

    select
        date_created_utc::date day,
        count(*) filter(where extract(hour from date_created_utc) between 8 and 10) q1,
        count(*) filter(where extract(hour from date_created_utc) between 11 and 14) q2,
        ...
    from order_processing
    group by date_created_utc::date
    

    【讨论】:

    • 谢谢。这很有帮助,但我想改用时间,因为最后一个时间间隔是 23:59。
    猜你喜欢
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    相关资源
    最近更新 更多