Django使用不同的时区查询外部数据库

时间:2016-09-17 20:11:16

标签: mysql django database postgresql

我在postgres上运行了一个带有TIME_ZONE='America/New_York'USE_TZ = True的Django API应用程序。

对于每日报告,我需要查询另一个数据库,MySQL,并比较postgres数据库中的记录以检查一些更新。它们应包含相同数量的结果。然而,MySQL DB的时区是UTC。如何对MySQL DB执行SELECT查询以使其与我的postgres DB上的相同日期范围匹配?

实施例: 这两个查询应返回相同数量的结果

# Django/Postgres with TIME_ZONE='America/New_York'`
MyObject.objects.filter(created_on__date=date(2016, 9, 17))

# External MySQL Databse in UTC
sql.execute('SELECT * from MY_TABLE where created_on BETWEEN "2016-09-17" AND "2016-09-18"')

1 个答案:

答案 0 :(得分:2)

您需要的是将MySQL中的日期转换为匹配America/New_York时区。

实现这一目标的功能是CONVERT_TZ(),因为您首先需要指定时区,所以需要设置time zone tables

如果您不确定命名时区是否可用,请查询以下问题 - 如果它返回零,则该表为空,因此使用命名时区不可用,您需要填充它们(我已经提到了上面文档的链接)。

SELECT COUNT(*) FROM mysql.time_zone_name;

mysql_tzinfo_to_sql用于填充时区表。

如果您的时区不是一个移动的时区,那么您可以通过明确键入时间差来采用不太安全,硬编码的方法(不推荐):

mysql> SELECT CONVERT_TZ('2016-09-17 10:00:00','+00:00','+06:00');
        -> '2016-09-17 16:00:00' -- Result