根据用户时区检索聚合数据

问题描述 投票:0回答:1

我有一个 postgres 数据库,其中所有数据均采用 UTC 格式。如果我需要显示一天的任何数据或聚合,我可以将本地时间转换为 UTC 并在查询中使用它。

但是,现在我必须实现一个图表,显示每天汇总的几个月数据。例如,根据用户每天添加的食物日志计算出 6 个月内每天消耗的卡路里。

问题是,如果用户位于比 GMT 早 9 小时以上的任何时区,则在上午 9 点(作为早餐)添加的任何日志都将存储在前一天。并且不会包含在结果中。

我最初的想法是从开始时间开始聚合超过 24 小时的时间间隔,但这对于何时应用或删除 DST 来说并不是一个好主意。一天有 23 或 25 小时,所有后续数据都会落后 1 小时。

在客户端,我可以访问用户的时区。我想到的解决方案是将时区与请求一起发送,以便可以使用时间戳检查所有行

AT TIME ZONE 'clients-time-zone'

这似乎是一个很常见的问题,我找不到任何好的资源。这是一个好主意还是有比这更好的方法?

就上下文而言,该应用程序位于 Flutter 中,后端构建在使用 Postgres 的 Supabase 之上。中间没有 API 层,因为我使用 DB 函数(存储过程)来获取所有所需的数据。

postgresql performance timestamp timezone
1个回答
0
投票

如果日期存储在列

t
中,该列的类型为
timestamp without time zone
并且包含 UTC 数据,并且客户端位于时区
Europe/Vienna
,则聚合如下:

GROUP BY CAST (t AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Vienna' AS date)

第一个

AT TIME ZONE
t
转换为绝对时间戳,第二个
AT TIME ZONE
将其转换为维也纳挂钟当时显示的内容,并且类型转换会截断它的日期。

© www.soinside.com 2019 - 2024. All rights reserved.