我有一个Postgres时钟警报表(不是真的,但这是类似的,并且更容易解释)。警报由用户设置,分辨率为 1 小时,用户可以来自许多不同的时区。警报每天都在重复。我想可靠地获取应该在一天中的特定时间响起的警报,但我遇到了夏令时问题。我如何以最好的方式做到这一点?
例子
阿尔弗雷德和洛塔都住在斯德哥尔摩(距世界标准时间 +1 小时,但在夏令时 +2 小时)。
Sharon 住在新加坡(距 UTC +8 小时,无 DST)在冬天,阿尔弗雷德设定了凌晨 4 点的闹钟。闹钟应在当地时间凌晨 4 点响起,全年无休。
在夏天,Lotta 将闹钟定在凌晨 5 点。同样,它应该全年在早上 5 点开始。
与此同时,Sharon 已经设置了上午 11 点的闹钟。所有这些都可以作为 03:00 UTC 存储在数据库中。
如果我在冬天查询数据库以获取应该在 03:00 UTC 发出的警报,我想要 Alfred 和 Sharon 的警报。新加坡现在距瑞典 +7h,因此新加坡的上午 11 点是瑞典的凌晨 4 点。洛塔的闹钟应该再过一个小时才响。
相反,如果我在夏季查询数据库以获取应该在 03:00 UTC 发出的警报,我想要 Lotta 和 Sharon 的警报。新加坡现在距瑞典 +6 小时,所以新加坡的上午 11 点现在是瑞典的上午 5 点。斯文的闹钟在一小时前响了。
我如何存储它并查询数据库?
如有必要,我可以更改数据库架构。目前,我们根本不针对 DST 进行调整,实际上只有一个“小时”整数字段(这看起来很愚蠢,时间字段会更好)。
看来我需要同时存储 UTC 时间和时区信息,但我不知道如何在 Postgres 中最好地实现这一点。我发现 Postgres 有某种时区概念,但据我所知没有时区字段类型。另外,我想我需要在 SQL 中进行一些计算,以确定如何根据时区数据和创建日期在选择中偏移 UTC 时间。我不太擅长 SQL……</p>
我确实想在 Postgres 中解决这个问题,因为可能会有很多“警报”,并且我想避免将它们全部提取到 Ruby 中并在那里过滤所带来的性能问题。(是的,这是一个 Rails 应用程序。)