gpt4 book ai didi

django - 通过 Django 的 connection.cursor() 在自定义函数中调用 Postgresql date_trunc

转载 作者:行者123 更新时间:2023-11-29 13:30:05 25 4
gpt4 key购买 nike

我创建了一个自定义 Postgresql 函数,该函数执行一些计算并使用 date_trunc 函数确定月初。在开发自定义函数时,我从使用 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';")

我希望有人能帮我想出一个更优雅的方法来解决这个问题。

最佳答案

  1. 在查询中使用 AT TIME ZONE 'FOO' 或 TIMEZONE('FOO', timestamp)(视情况使用实际时区名称的参数);见http://www.postgresql.org/docs/9.2/static/functions-datetime.html#FUNCTIONS-DATETIME-ZONECONVERT
  2. 为查询创建上下文管理器,以保存/设置/恢复特定查询周围的时区

关于django - 通过 Django 的 connection.cursor() 在自定义函数中调用 Postgresql date_trunc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25931554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com