15

我想对数据库中的行进行 SUM 并按日期分组。

我正在尝试使用 Django 聚合和注释运行此 SQL 查询:

select strftime('%m/%d/%Y', time_stamp) as the_date, sum(numbers_data)
    from my_model
    group by the_date;

我尝试了以下方法:

data = My_Model.objects.values("strftime('%m/%d/%Y',
           time_stamp)").annotate(Sum("numbers_data")).order_by()

但似乎您只能在 values() 函数中使用列名;它不喜欢使用 strftime()。

我该怎么办?

4

5 回答 5

14

这对我有用:

select_data = {"d": """strftime('%%m/%%d/%%Y', time_stamp)"""}

data = My_Model.objects.extra(select=select_data).values('d').annotate(Sum("numbers_data")).order_by()

花了一点时间才发现我必须避开 % 符号。

于 2009-04-06T19:45:11.013 回答
5

从 v1.8 开始,您可以使用Func() 表达式

例如,如果您恰好针对 AWS Redshift 的日期和时间函数:

from django.db.models import F, Func, Value

def TimezoneConvertedDateF(field_name, tz_name):
    tz_fn = Func(Value(tz_name), F(field_name), function='CONVERT_TIMEZONE')
    dt_fn = Func(tz_fn, function='TRUNC')
    return dt_fn

然后你可以像这样使用它:

SomeDbModel.objects \
 .annotate(the_date=TimezoneConvertedDateF('some_timestamp_col_name',
                                           'America/New_York')) \
 .filter(the_date=...)

或像这样:

SomeDbModel.objects \
 .annotate(the_date=TimezoneConvertedDateF('some_timestamp_col_name',
                                           'America/New_York')) \
 .values('the_date') \
 .annotate(...)
于 2016-07-09T19:57:13.843 回答
1

通过对数据库运行以下查询,任何不只是在数据库中执行此操作的理由:

select date, sum(numbers_data) 
from my_model 
group by date;

如果您的答案是,日期是具有非零小时、分钟、秒或毫秒的日期时间,我的答案是使用日期函数来截断日期时间,但我无法确切告诉您那是什么而不知道是什么您正在使用的 RBDMS。

于 2009-04-06T17:12:10.727 回答
1

我不确定strftime,我下面的解决方案是使用sql postgres trunc ...

select_data = {"date": "date_trunc('day', creationtime)"}       
ttl = ReportWebclick.objects.using('cms')\
                    .extra(select=select_data)\
                    .filter(**filters)\
                    .values('date', 'tone_name', 'singer', 'parthner', 'price', 'period')\
                    .annotate(loadcount=Sum('loadcount'), buycount=Sum('buycount'), cancelcount=Sum('cancelcount'))\
                    .order_by('date', 'parthner')

-- 等于sql查询执行:

选择 date_trunc('month', creationtime) 作为日期,tone_name,sum(loadcount),sum(buycount),sum(cancelcount)
来自 webclickstat
按tone_name、日期分组;
于 2016-03-17T14:13:30.303 回答
0

当我的数据库是 mysql 时,我的解决方案是这样的:

select_data = {"date":"""FROM_UNIXTIME( action_time,'%%Y-%%m-%%d')"""} 
qs = ViewLogs.objects.filter().extra(select=select_data).values('mall_id', 'date').annotate(pv=Count('id'), uv=Count('visitor_id', distinct=True))

要使用哪个函数,您可以阅读 mysql 日期时间处理器文档,例如 DATE_FORMAT,FROM_UNIXTIME...

于 2018-04-10T03:52:22.040 回答