当前位置: 首页 > 知识库问答 >
问题:

Django按月份和年份统计人数

凤经国
2023-03-14

我一直在调试,但我不能得到正确的结果。在我的django应用程序中,我扩展了auth_user以添加更多字段:

from django.contrib.auth.models import User
class Person(User):
    api_id = models.CharField(max_length=255)
    api_key = models.CharField(max_length=255)

现在,我想根据用户加入的日期,按年和月统计用户:

Person.objects.annotate(year=truncyear(“date_joined”),month=truncmonth(“date_joined”))。values(“year”,“month”)。annotate(count=count(“pk”))

但是,我得到的只是数据库中每个用户的count=1,而没有按年和月对他们进行分组。

这是正在执行的实际查询:

SELECT CAST(DATE_FORMAT(CONVERT_TZ(`auth_user`.`date_joined`, 'UTC', 'Europe/Madrid'), '%Y-01-01 00:00:00') AS DATETIME) AS `year`, CAST(DATE_FORMAT(CONVERT_TZ(`auth_user`.`date_joined`, 'UTC', 'Europe/Madrid'), '%Y-%m-01 00:00:00') AS DATETIME) AS `month`, COUNT(`mt_api_app_person`.`user_ptr_id`) AS `count` FROM `mt_api_app_person` INNER JOIN `auth_user` ON (`mt_api_app_person`.`user_ptr_id` = `auth_user`.`id`) GROUP BY CAST(DATE_FORMAT(CONVERT_TZ(`auth_user`.`date_joined`, 'UTC', 'Europe/Madrid'), '%Y-01-01 00:00:00') AS DATETIME), CAST(DATE_FORMAT(CONVERT_TZ(`auth_user`.`date_joined`, 'UTC', 'Europe/Madrid'), '%Y-%m-01 00:00:00') AS DATETIME), `auth_user`.`date_joined` ORDER BY `auth_user`.`date_joined` DESC

所有count=1似乎是因为组BY[...]“auth_user”。“date_joined”,它按整个日期时间而不是仅按月和年对条目进行分组。

这里发生了什么有什么线索吗?如果我对用户执行相同的查询,我会得到我想要的。

共有2个答案

罗学真
2023-03-14

您的查询似乎有一个错误。您使用truncyear来表示月份和年份,这就是为什么您只获得一个值,即年份值。

月份:

Person.objects.annotate(month=TruncMonth("date_joined")).values("month").annotate(count=Count("pk"))

年份:

Person.objects.annotate(year=TruncYear("date_joined")).values("year").annotate(count=Count("pk"))
越俊艾
2023-03-14

使用TruncMonth和TruncYear

from django.db.models import Count
from django.db.models.functions import TruncMonth, TruncYear

Person.objects.annotate(month=TruncMonth('date_joined')).values('month').annotate(total=Count('pk'))
Person.objects.annotate(year=TruncYear('date_joined')).values('year').annotate(total=Count('pk'))
 类似资料:
  • 我有以下数据框: 我需要按年和月分组数据。即:按2013年1月、2013年2月、2013年3月等分组...我将使用新分组的数据来创建一个显示每年/每月abc vs xyz的图表。 我尝试过groupby和sum的各种组合,但似乎没有任何效果。 谢谢你的帮助。

  • 问题内容: 我有以下数据框: 我需要按年份和月份对数据进行分组。例如:按2013年1月,2013年2月,2013年3月等分组。我将使用新分组的数据创建一个显示每年/每月abc vs xyz的图表。 我已经尝试了groupby和sum的各种组合,但是似乎什么也无法工作。 感谢您的协助。 问题答案: 您可以使用重采样或(在后台重采样)。 首先,请确保datetime列实际上是datetimes(用命中

  • 问题内容: 我正在处理Java作业,它涉及在用户指定月份和年份之后打印日历。我不能使用Calendar或GregorianCalendar类。我的问题是日历在星期六的第一天无法正确打印月份。我已经看了大约一个小时的代码,但不确定出什么问题。我正在使用Zeller的Congruence查找以“ h”表示的每月的第一天。 例如,2008年3月的日历(错误地)如下所示: 这是我的代码: 问题答案: 从星

  • 我的数据类型是格式化为“yyyy-mon-dd”的日期,我希望提取要格式化为“mon yyyyy”的月份和年份,同时将数据类型保留为date,以便能够与ADD_MONTHS函数一起使用。有办法这样做吗?我从名为date_process的数据字段中提取日期。

  • 有没有一个简单的方法可以做到这一点?

  • 问题内容: 我正在写一个PHP应用程序,它将学生数据存储在MySQL关系数据库中。我试图找到最好的方式/数据类型来存储一个月和一年在一起,而没有一天。我不知道是否应该将其存储为DATE并以某种方式使用php将日期存储为第一天,或使用我目前不熟悉的其他数据类型。理想情况下,我不想存储一天,因为一天不会总是相同的,并且如果将来更改一天,则需要更改php源代码。 为了获取更多背景信息,我存储了一个学生的

  • 问题内容: 如何在SELECT中查找一年中的第一天? 我找到了这个月份-但是我没有足够的掌握年份的信息:(我一直在寻找一个单独的查询来查找月份开始和现在之间的数据) 问题答案: 我认为您需要: 老实说,您可以执行以下操作:

  • 我在利用这一刻。js以特定的形式显示时间- 上面的代码以下面的格式显示日期和时间 0年0月1天37小时 我需要展示这样的东西 0年0月1天13小时 我已经尝试使用from现在和from https://momentjs.com/docs/#/displaying/from/ 但无法获得输出。我怎样才能做到这一点。