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/

+0

谢谢。链接很有用,我发现了一种使用'date_trunc_sql'解决我的问题的方法。此外,这个评论帮助。 https://*.com/questions/25385370/django-orm-with-date-trunk-function-and-timezones – Vlad

+0

我看到有一个connection.ops.datetime_trunc_sql函数需要时区作为参数,但我不能那工作。有什么想法如何做到这一点?它后来关闭连接,在'queryset = queryset.extra({'day':truncate_date}')这行''''' – Vlad

+0

AFAIK这个特定的行不应该调用SQL查询。但我可能是错的。我想尝试的一件事是将其包装在交易中。 https://docs.djangoproject.com/en/1.11/topics/db/transactions/#django.db.transaction.atomic –