Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Postgres:如何按日期对启用时区的datetime字段进行分组_Django_Postgresql_Orm - Fatal编程技术网

Django Postgres:如何按日期对启用时区的datetime字段进行分组

Django Postgres:如何按日期对启用时区的datetime字段进行分组,django,postgresql,orm,Django,Postgresql,Orm,我对prostgresql和django有这样的问题: 我有很多事件是在某个日期、某个时间创建的,它们存储在datetime字段created中 我希望根据创建的字段的日期部分进行聚合。最简单的例子是:这个月每天有多少事件? 所创建的字段可识别时区。因此,结果应该根据用户所在的时区而变化。例如,如果您在2017-10-02 UTC时间23:30创建了两个事件,如果您从UTC-1查看它们,您应该在10月3日00:30看到它们,并且总数应该在第3天相加 我正在努力找到一个解决这个问题的方法,它可

我对prostgresql和django有这样的问题:

我有很多事件是在某个日期、某个时间创建的,它们存储在datetime字段
created

  • 我希望根据
    创建的
    字段的日期部分进行聚合。最简单的例子是:
    这个月每天有多少事件?
  • 所创建的
    字段可识别时区。因此,结果应该根据用户所在的时区而变化。例如,如果您在2017-10-02 UTC时间23:30创建了两个事件,如果您从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\u trunc\u sql之前使用其他函数,然后链接该函数


谢谢

您可能正在寻找以下内容:

但是请记住,这可能与django的配置方式冲突

Django 2.2+支持带时区的数据库功能

现在,您可以执行以下操作:

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")

谢谢这些链接很有用,我找到了一种使用
date\u trunc\u sql
解决问题的方法。这篇文章中的评论也有所帮助。我看到有一个connection.ops.datetime\u trunc\u sql函数,它将时区作为参数,但我无法使其工作。你知道怎么做吗?之后,它在
queryset=queryset.extra({'day':truncate\u date})行上关闭了连接。确认此特定行不应调用SQL查询。不过我可能错了。有一件事我会尝试将其包装在事务中。