我需要编写django raw查询来过滤年份和月份。为此,我尝试了以下代码。
cursor = connection.cursor()
cursor.execute('SELECT SUM(work_time) AS sum FROM structure_tracking_details WHERE employee_id = %s AND tree_id=%s AND project_structure=%s AND year(date)=%s AND month(date)=%s GROUP BY project_structure ', [employee_id,tree_id,project_structure,select_year,select_month] )
sum1=str(cursor.fetchone())
但它告诉no such function: year
我的代码有什么问题?
答案 0 :(得分:3)
SQLite doesn't have a YEAR()
function。如果你想要年份,你可以使用这样的东西 -
select strftime('%Y', datetime(datefield, 'unixepoch')) as year from table_name
因此,您可以编写year(date)=%s
而不是撰写strftime('%Y', date) = %s
。它应该工作。我还没试过。
或者让所有这些头痛并使用Django的ORM。你应该在第一时间使用它。
编辑:
根据OP,这个查询有效 -
cursor.execute("SELECT SUM(work_time) AS sum FROM structure_tracking_details WHERE employee_id = %s AND tree_id=%s AND project_structure=%s AND strftime('%%Y', date) = %s AND strftime('%%m', date) = %s GROUP BY project_structure ", employee_id, tree_id, project_structure, select_year, select_month])
%Y
需要使用%%Y
进行转义。
答案 1 :(得分:2)
为什么不使用ORM?
如果您有这样的模型:
class Work(models.Model):
date_field = models.DateField()
# your other fields
Work.objects.filter(date_field__year=2013,date_field__month=2)
现在,添加其余内容,即work_time
和group by的总和:
from django.models import Sum
Work.objects.filter(date_field__year=2013,
date_field__month=2,
employee_id=1,
...).values('project_structure').aggregate(total=Sum('work_time'))