【问题标题】: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)']
      

      一年有效。

      【讨论】:

        猜你喜欢
        • 2023-03-28
        • 1970-01-01
        • 2017-10-17
        • 1970-01-01
        • 2012-02-03
        • 1970-01-01
        • 2021-08-10
        • 2019-09-07
        • 2014-03-12
        相关资源
        最近更新 更多