Django原始查询按年和月过滤

时间:2013-05-22 09:51:15

标签: django sqlite

我需要编写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我的代码有什么问题?

2 个答案:

答案 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

您可以使用yearmonth查询执行此查询:

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'))