我在使用prostgresql和django时遇到了这个问题:
我在某个特定时间创建了很多事件,这些事件存储在日期时间字段created
中。
created
字段的日期部分进行聚合。最简单的例子是:how many event are in each day of this month?
。created
字段可识别时区。因此,结果应根据用户所在的时区而变化。例如,如果您在2017-10-02的UTC时间23:30创建2个事件,如果您从UTC-1查看它们,您应该在10月3日在00:30,总数应该为第3个增加。我正在努力寻找能够处理大量数据的问题的解决方案。所以每天做的事情和SQL语句都不是一个选择。我想要的东西可以翻译成:
SELECT count(*) from table GROUP BY date
现在我找到了问题第一部分的解决方案:
from django.db import connection
truncate_date = connection.ops.date_trunc_sql('day', 'created')
queryset = queryset.extra({'day': truncate_date})
total_list = list(queryset.values('day').annotate(amount=Count('id')).order_by('day'))
有没有办法在其中添加date_trunc_sql函数用来计算日期的时区?或者在date_trunc_sql之前的其他一些函数然后链接那个。
谢谢!
答案 0 :(得分:4)
您可能正在寻找:timezone aware date_trunc function
但请记住,这可能与您的django的配置方式有冲突。 https://docs.djangoproject.com/en/1.11/topics/i18n/timezones/
答案 1 :(得分:0)
Django 2.2+支持带有时区的TruncDate
数据库功能
您现在可以执行以下操作:
import pytz
east_coast = pytz.timezone('America/New_York')
queryset.annotate(created_date=TruncDay("created", tzinfo=east_coast))
.values("created_date")
.order_by("created_date")
.annotate(count=Count("created_date"))
.order_by("-created_date")