date_trunc
我创建了一个自定义 Postgresql 函数,该函数执行一些计算并使用该函数确定一个月的开始。在开发自定义函数时,我从使用 psql 建立的数据库连接中检查了它,它工作得很好。虽然这样的连接我得到以下输出:
select date_trunc('month', TIMESTAMP WITH TIME ZONE '2014-09-14 04:10:00+02');
date_trunc
------------------------
2014-09-01 00:00:00+02
(1 row)
这正是我想要的:它给了我所在时区的月初。如果我尝试在 django shell 中做同样的事情(我使用的是 psycopg2 连接器),我会得到不同的结果:
>>> from django.db import connection
>>> cursor = connection.cursor()
>>> cursor.execute("select date_trunc('month', TIMESTAMP WITH TIME ZONE '2014-09-14 04:10:00+02');")
>>> unicode(cursor.fetchone()[0])
u'2014-09-01 00:00:00+00:00'
如您所见,数据库以 UTC 时间返回月初,导致与我想要的实际时间戳有两个小时的偏移量。
这是 django 将数据库连接的时间戳设置为 UTC 的结果,这会导致date_trunc
在 UTC 时间截断月份。我尝试使用 手动设置连接的时区SET TIMEZONE TO 'Europe/Berlin'
,但这会导致AssertionError("database connection isn't set to UTC")
.
以下解决方法在我的情况下确实有效,但它并不是一个真正的解决方案。它只有效,因为我不需要函数的任何返回值。
cursor.execute("SET TIMEZONE to 'Europe/Berlin'; my_function(parameters); SET TIMEZONE to 'UTC';")
我希望有人可以帮助我找出一种更优雅的方法来解决问题。