我正在构建一个针对德国受众的 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")
更改查询来自
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;
是的,可能会给此类查询带来一些不便,但似乎不是很强。至少不会对生产数据库产生任何影响