【问题标题】:How to do a group by/count(*) pr year, month and day in django based on a datetime database field?如何根据日期时间数据库字段在 django 中按 /count(*) pr 年、月和日进行分组?
【发布时间】:2011-03-24 04:39:36
【问题描述】:
我有一个表格,描述带有日期时间字段的文件。我想以某种方式创建一个报告,为我提供按年分组的文件数、按年和月分组的文件数以及按年、月和日分组的文件数。我只想要 count(*) > 0 的记录。最好在 django 中使用 ORM,或者如果这不可能,则使用在 PostgreSQL 和 SQLite 上运行的一些 SQL。
这个数据库中的记录数量可能很大,所以我尝试在代码中执行此操作,而不是在 SQL 中(或通过 ORM 间接在 SQL 中)不起作用,如果我让它工作,我不认为它将完全扩展。
感谢任何提示或解决方案。
【问题讨论】:
标签:
python
sql
django
datetime
aggregate
【解决方案1】:
通常我在 Oracle 上工作,但快速的谷歌搜索表明这也适用于 Postgres。在几分钟内你可以这样做
select to_char(yourtimestamp,'yyyymmdd hh24:mi'), count(*)
from yourtable
group by to_char(yourtimestamp,'yyyymmdd hh24:mi')
order by to_char(yourtimestamp,'yyyymmdd hh24:mi') DESC;
这一直有效到几年:
select to_char(yourtimestamp,'yyyy'), count(*)
from yourtable
group by to_char(yourtimestamp,'yyyy')
order by to_char(yourtimestamp,'yyyy') DESC;
你只会得到你得到一些东西的岁月。我想这就是你想要的。
编辑:您需要在“yourtimestamp”上建立一个索引,否则如果您确实有很多行,性能会很差。
【解决方案2】:
我的错误 - date() 函数仅适用于 MySql:
也许试试这个(SQLite):
tbl = MyTable.objects.filter()
tbl = tbl.extra(select={'count':'count(strftime('%Y-%m-%d', timestamp))', 'my_date':'strftime('%Y-%m-%d', timestamp))'}
tbl = tbl.values('count', 'my_date')
tbl.query.group_by = ['strftime('%Y-%m-%d', timestamp)']
对于日期和月份,您可以将 '%Y-%m-%d' 替换为日期格式字符串的变体。
这是为 MySQL 准备的(以防万一有人需要)
tbl = MyTable.objects.filter()
tbl = tbl.extra(select={'count':'count(date(timestamp))', 'my_date':'date(timestamp)'}
tbl = tbl.values('count', 'my_date')
tbl.query.group_by = ['date(timestamp)']
一年有效。