Django的Postgres的:如何分组按日期时区时间字段启用
问题描述:
我有这个问题,prostgresql和Django的:Django的Postgres的:如何分组按日期时区时间字段启用
我在某个时间有很多在某一日期创建的事件,这存储在日期时间字段created
中。
- 我想根据
created
字段的日期部分进行汇总。最简单的例子是:how many event are in each day of this month?
。 -
created
字段是可识别时区的。因此,结果应根据用户所处的时区而变化。例如,如果您在2017年10月2日23:30 UTC时间创建了2个事件(如果您从UTC-1查看它们),则应在10月3日00:30,总数应该增加到第三。
我很努力地找到解决这个问题的方法,可以处理大量数据。所以对于每一天和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之前的其他函数,然后链接那一个。
谢谢!
答
你可能在寻找这样的:timezone aware date_trunc function
记住但是承担这可能与你的Django是如何配置的冲突。 https://docs.djangoproject.com/en/1.11/topics/i18n/timezones/
谢谢。链接很有用,我发现了一种使用'date_trunc_sql'解决我的问题的方法。此外,这个评论帮助。 https://*.com/questions/25385370/django-orm-with-date-trunk-function-and-timezones – Vlad
我看到有一个connection.ops.datetime_trunc_sql函数需要时区作为参数,但我不能那工作。有什么想法如何做到这一点?它后来关闭连接,在'queryset = queryset.extra({'day':truncate_date}')这行''''' – Vlad
AFAIK这个特定的行不应该调用SQL查询。但我可能是错的。我想尝试的一件事是将其包装在交易中。 https://docs.djangoproject.com/en/1.11/topics/db/transactions/#django.db.transaction.atomic –