首页 > 解决方案 > 如何使用自定义开始时间 PostrgresQL 按日期对总和结果进行分组

问题描述

我正在尝试按 Postgresql 中的自定义日期对总和结果进行分组。由于正常的一天从 00:00 开始,我希望我的从 04:00am 开始,所以如果有时间进入 2019-01-03 02:23 它将计入 '2019-01-02' 。

现在我的代码看起来像这样:底部在日期类型 00:00 - 23.59 上完美运行,但是我想按上面创建的上限对其进行分组。我只是不知道如何连接这两个部分。

with dateRange as(
SELECT
generate_series(
MIN(to_date(payments2.paymenttime,'DD Mon YYYY')) + interval '4 hour',
max(to_date(payments2.paymenttime,'DD Mon YYYY')),
'24 hour') as theday
from payments2
)

select 
sum(cast(payments2.servicecharge as money)) as total,
to_date(payments2.paymenttime,'DD Mon YYYY') as date
from payments2
group by date

像这样的结果

+------------+------------+
|    total   |    date    |
+------------+------------+
|     20     | 2019-01-01 |
+------------+------------+
|     60     | 2019-01-02 |
+------------+------------+
|     35     | 2019-01-03 |
+------------+------------+
|     21     | 2019-01-04 |
+------------+------------+

非常感谢您的帮助。

标签: sqlpostgresql

解决方案


如果我没有误解你的问题,你只需要在转换到日期之前从时间戳中减去 4 小时,你甚至不需要 CTE。

就像是

select 
sum(cast(payments2.servicecharge as money)) as total,
(to_timestamp(payments2.paymenttime,'DD Mon YYYY HH24:MI:SS') - interval '4 hours')::date as date
from payments2
group by date

Yu 可能需要在to_timestamp函数中使用不同的格式,具体取决于payments2.paymenttime字符串的格式


推荐阅读