我想对数据库中的行进行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()。
我应该怎么做?
答案 0 :(得分:15)
这对我有用:
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()
稍微弄清楚我必须逃脱%号。
答案 1 :(得分:4)
从v1.8起,您可以使用Func() expressions。
例如,如果您碰巧定位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(...)
答案 2 :(得分:1)
任何理由不在数据库中执行此操作,方法是对数据库运行以下查询:
select date, sum(numbers_data)
from my_model
group by date;
如果您的答案是,日期是一个非零小时,分钟,秒或毫秒的日期时间,我的答案是使用日期函数截断日期时间,但我无法确切地告诉您这是什么不知道你正在使用什么RBDMS。
答案 3 :(得分: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查询执行:
select date_trunc('month', creationtime) as date, tone_name, sum(loadcount), sum(buycount), sum(cancelcount) from webclickstat group by tone_name, date;
答案 4 :(得分:0)
我的解决方案是这样的:
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 datetime处理器文档,如DATE_FORMAT,FROM_UNIXTIME ......