我有一个在 postgres 上运行的 Django API 应用程序,其中使用 TIME_ZONE='America/New_York'
和 USE_TZ = True
。
对于每日报告,我需要查询另一个数据库 MySQL,并比较 postgres DB 中的记录以检查是否有一些更新。它们应该包含相同数量的结果。然而,MySQL 数据库的时区是 UTC。如何对 MySQL 数据库执行 SELECT
查询以使其与 postgres 数据库上的相同日期范围匹配?
示例: 这两个查询应返回相同数量的结果
# 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"')
最佳答案
您需要将 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
关于mysql - Django 使用不同时区查询外部数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39551254/