Postgresql 没有时间的命令,但需要展示它

Postgresql 没有时间的命令,但需要展示它,postgresql,Postgresql,我需要创建一个指标,显示一周中某一天每小时创建的订单数量。但是数据库中的任何记录都有一段时间。但这一次我还需要展示 选择计数(id), 日期(“小时”,创建于时区“美国/太平洋”)::时间为“时间” 从“订单” 在哪里创建字符(在“天”创建),如“%wed%” 按日期分组(“小时”,创建于时区“美国/太平洋”)::时间 结果,我有了这样的东西 计时 6 | 00:00:00 |+--+------------+ 3 | 01:00:00 |+--+------------+ 4 | 03:00

我需要创建一个指标,显示一周中某一天每小时创建的订单数量。但是数据库中的任何记录都有一段时间。但这一次我还需要展示

选择计数(id),
日期(“小时”,创建于时区“美国/太平洋”)::时间为“时间”
从“订单”
在哪里创建字符(在“天”创建),如“%wed%”
按日期分组(“小时”,创建于时区“美国/太平洋”)::时间
结果,我有了这样的东西

计时
6 | 00:00:00 |
+--+------------+
3 | 01:00:00 |
+--+------------+
4 | 03:00:00 |
+--+------------+
5 | 05:00:00 |
+--+------------+

但我需要这个

计时
6 | 00:00:00 |
+--+------------+
3 | 01:00:00 |
+--+------------+
0 | 02:00:00 |
+--+------------+
4 | 03:00:00 |
+--+------------+
0 | 04:00:00 |
+--+------------+

|5 | 05:00:00 |
+--+-----------+

一个选项是使用包含所有可能时间的日历表,然后与该日历表联接:

WITH times AS (
    SELECT '00:00:00'::time AS timeval UNION ALL
    SELECT '01:00:00'::time UNION ALL
    SELECT '02:00:00'::time UNION ALL
    ...
    SELECT '23:00:00'::time
)

SELECT
    COUNT(*) AS count,
    t.timeval
FROM times t
LEFT JOIN "order" o
    ON t.timeval = date_trunc('hour', o.created_at at time zone 'US/Pacific')::time AND
    to_char(o.created_at, 'day') LIKE '%wed%'
GROUP BY
    t.timeval;
如果您不想报告完整的24小时,只需修改
时间
CTE以仅包括您想要的小时数。

为什么不这样做:

select count(id),
       date_trunc('hour', created_at at time zone 'US/Pacific')::time as "time"
from "order"
where to_char(created_at, 'day') like '%wed%' and count(id)=0 or count(id)!=0
group by date_trunc('hour', created_at at time zone 'US/Pacific')::time

我对此表示怀疑。设置一个演示并将链接粘贴到这里,带有实际数据。你是认真的吗?实际数据库的链接?请使用实际数据,并将链接粘贴到此处。我想我的答案应该是有效的。你知道左键是如何起作用的吗?CTE中的每个时间间隔都保证出现在输出中,即使它与表中的任何记录都不匹配。您可能使用了一个内部联接,但实际上不起作用。@Cornholio假设我确实知道Postgres,但我不知道:-。。。顺便说一句,你是Beavis&Butthead的粉丝吗?因为你不能在postgresqlAh中的何处使用聚合函数对不起,我没有看到你的标签