Django原始查询过滤器(按年份和月份)
我需要编写django原始查询来过滤年份和月份。为此,我尝试了以下代码Django原始查询过滤器(按年份和月份),django,sqlite,Django,Sqlite,我需要编写django原始查询来过滤年份和月份。为此,我尝试了以下代码 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
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())
但是它告诉
没有这样的函数:year
我的代码怎么了?为什么不使用ORM
如果您有这样的模型:
class Work(models.Model):
date_field = models.DateField()
# your other fields
您可以使用和查找来执行此查询:
现在,添加剩下的内容,即工作时间
和分组方式的总和:
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'))
你为什么不使用ORM 如果您有这样的模型:
class Work(models.Model):
date_field = models.DateField()
# your other fields
您可以使用和查找来执行此查询:
现在,添加剩下的内容,即工作时间
和分组方式的总和:
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'))
。如果你想要一年,你可以用这样的东西-
select strftime('%Y', datetime(datefield, 'unixepoch')) as year from table_name
因此,您可以编写strftime(“%Y”,date)=%s
,而不是编写year(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
进行转义。如果你想要一年,你可以用这样的东西-
select strftime('%Y', datetime(datefield, 'unixepoch')) as year from table_name
因此,您可以编写strftime(“%Y”,date)=%s
,而不是编写year(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年份是您的列名?没有列名是日期您有什么数据库作为后端?sqlite数据库现在稍后我将更改为mysql@Lahiruzz那你为什么要标记mysql?我认为SQLite没有YEAR()
函数。YEAR是您的列名吗?没有列名是date您有什么数据库作为后端?SQLite数据库现在稍后我将更改为mysql@Lahiruzz那你为什么要标记mysql?而且我不认为SQLite有YEAR()
function.OP可能只是查询一些他们没有建模的表。@Burhan:是否有用于Group by的函数@Lahiruzz@Burhan:你能帮我把这些总值分配给一些变量吗。var=完全正确?@Lahiruzz通读本手册;希望这能回答这个问题,任何其他的.OP都可能只是查询一些他们没有建模的表。@Burhan:GROUPBY有什么函数吗@Lahiruzz@Burhan:你能帮我把这些总值分配给一些变量吗。var=完全正确?@Lahiruzz通读本手册;希望这能回答这个问题和其他任何问题。我需要从表中筛选年份吗?有任何函数吗?现在我在索引140处得到了:不支持的格式字符“Y”(0x59),我不知道为什么:(尝试“%Y”
而不是“%Y”
。您的终端是单引号。同样的错误。这是我的查询::cursor.execute(“选择总和(工作时间))作为结构跟踪详细信息的总和,其中员工id=%s和树id=%s以及项目结构=%s和strftime(“%y”,日期)=%s和strftime(“%m”,日期)=%s按项目结构分组,[employee\u id,树id,项目结构,选择年,选择月])谁说过关于y
?它是y
。请阅读文档。我需要从表中筛选年份?是否有任何函数?现在我得到:索引140处不支持的格式字符“y”(0x59),我不知道为什么:(尝试%y)
而不是“%Y”
。您的终端是单引号。同样的错误。这是我的查询::cursor。执行(“从结构跟踪详细信息中选择SUM(工作时间)作为SUM,其中员工id=%s和树id=%s,项目结构=%s和strftime(“%Y”,日期)=%s和strftime(“%m”,日期)=%s按项目结构分组”,[employee\u id,tree\u id,project\u structure,select\u year,select\u month])谁说了关于y
?是y
。请阅读文档。