如何为ActiveRecord查询设置时区以获取准确的数字?

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

我正在构建一个针对德国受众的 Rails 7 应用程序。

我当前的德国当地时间是 Fri Jun 21 12:10:23 CEST 2024(从终端中的

date
输出)。当我登录到我的生产 Ubuntu 服务器并输入
date
时,我得到了相同的结果 - Fri Jun 21 12:10:23 CEST 2024

我运行一些 CRON 作业,这些作业在德国时间午夜开始 - 即世界标准时间晚上 10 点。然后,我想对数据进行一些统计,但它不准确。经过深入研究这个问题,是因为在服务器上,数据存储在UTC时区的PostgreSQL数据库中,因此不准确。

在 StackOverflow 上,我发现了同样的问题

我尝试设置

config.time_zone = 'Berlin'
,但没有效果 - 显然,我需要添加
config.active_record.default_timezone = :local
才能使其正常工作。

但是,如果我这样做,数据库中的现有数据会发生什么情况?现有日期会转换为

:local
吗?还是只将新日期设置为
:local
?更改数据库时区是否会产生任何后果,可能会给我将来带来麻烦?

我有一个包含客户数据的生产数据库,因此我试图在可能进行此更改时评估所有“危险”场景。

编辑:统计示例

@data = Model.find_by_sql("SELECT DATE_TRUNC('day', created_at) AS day, 
                                      COUNT(id) as tasks, 
                                      SUM(revenue) AS revenue, 
                                      SUM(tasks_created) AS tasks_created
                                    FROM tasks 
                                    GROUP BY day
                                    ORDER BY day DESC
                                    LIMIT 10")
ruby-on-rails timezone rails-activerecord
1个回答
0
投票

更改查询来自

SELECT DATE_TRUNC('day', created_at) AS day, 
COUNT(id) as tasks, 
SUM(revenue) AS revenue, 
SUM(tasks_created) AS tasks_created
FROM tasks 
GROUP BY day
ORDER BY day DESC
LIMIT 10;

SELECT DATE_TRUNC('day', created_at AT TIME ZONE 'Europe/Berlin') AS day, 
COUNT(id) as tasks, 
SUM(revenue) AS revenue, 
SUM(tasks_created) AS tasks_created
FROM tasks 
GROUP BY day
ORDER BY day DESC
LIMIT 10;

是的,可能会给此类查询带来一些不便,但似乎不是很强。至少不会对生产数据库产生任何影响

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