我对日期有一个真正的问题,并在 django 中使用 connection.cursor() 运行自定义 sql。
目前,我向最终用户显示的每个日期都使用 .astimezone(timezone) 进行转换,但我有这个自定义查询,它可以操纵日期。这是查询:
SELECT date_trunc('day', a.date_done) AS date, sum(b.uploads) FROM celery_taskmeta a
INNER JOIN core_taskextend b
ON a.task_id = b.task_id
WHERE a.status = 'SUCCESS'
AND a.date_done > (now() - interval '7 days')
GROUP BY date
ORDER BY date;
返回的日期是 +4 小时,通常我会按上述方式转换以获得正确的日期,但是在查看数据库时,日期似乎对我的时区是正确的。所以不确定我是否理解发生了什么。我不确定如何使用 ORM 实现上述功能,因此选择了自定义查询。
顺便说一句,在我的数据库客户端SELECT now();
中正确设置为我的时区。在 djangoTIME_ZONE = 'US/Eastern'
和USE_TZ = True
.
然后我尝试将时区传递给查询,如下所示:
SELECT date_trunc('day', a.date_done AT TIME ZONE 'US/Eastern') AS date, sum(b.uploads) FROM celery_taskmeta a
INNER JOIN core_taskextend b
ON a.task_id = b.task_id
WHERE a.status = 'SUCCESS'
AND date_trunc('day', a.date_done AT TIME ZONE 'US/Eastern') > date_trunc('day', (now() AT TIME ZONE 'US/Eastern') - interval '2 days')
GROUP BY date
ORDER BY date;
与在我的数据库客户端中通过 sql 控制台简单地运行查询相比,这仍然会导致意外结果。后者看起来是正确的。似乎 django 正在使用时区。
如果有人能给她一些光,将不胜感激。
谢谢。