Django GROUP BY strftime 日期格式
Posted
技术标签:
【中文标题】Django GROUP BY strftime 日期格式【英文标题】:Django GROUP BY strftime date format 【发布时间】:2010-10-17 20:44:25 【问题描述】:我想对数据库中的行进行 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()。
我该怎么办?
【问题讨论】:
刚刚发现这个:code.djangoproject.com/ticket/10302 【参考方案1】:这对我有用:
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()
花了一点时间才发现我必须避开 % 符号。
【讨论】:
我得到了类似的东西:Out[15]: <repr(<django.db.models.query.QuerySet at 0x749ef90>) failed: django.db.utils.OperationalError: (1305, 'FUNCTION xxxxxx.strftime does not exist')>
任何想法为什么?
我遇到了同样的错误。你发现它为什么不能识别 strftime 了吗?【参考方案2】:
从 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(...)
【讨论】:
【参考方案3】:任何不只在数据库中执行此操作的理由,通过对数据库运行以下查询:
select date, sum(numbers_data)
from my_model
group by date;
如果您的答案是,日期是具有非零小时、分钟、秒或毫秒的日期时间,我的答案是使用日期函数截断日期时间,但我无法准确告诉您那是什么不知道您使用的是什么 RBDMS。
【讨论】:
现在我只是使用 sqlite3 来证明概念。 “日期”确实是一个日期时间字段。我正在使用 strftime() 将日期时间字段截断为日期。 sqlite3有更好的东西吗? “只需在数据库中执行此操作”是什么意思?谢谢! 我的意思是,只需使用 Django 中现有的任何工具来进行直接的 sql 选择。【参考方案4】:我不确定 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、日期分组;【讨论】:
【参考方案5】:当我的数据库是 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...
【讨论】:
请格式化您的代码 sn-p 以便其他人/OP可以阅读以上是关于Django GROUP BY strftime 日期格式的主要内容,如果未能解决你的问题,请参考以下文章
Django- Group by 和 Count by unique together
如何选择 COUNT(*) GROUP BY DJANGO? [复制]