【问题标题】:Django raw query filter by year and monthDjango 原始查询过滤器按年和月
【发布时间】:2013-05-22 09:51:15
【问题描述】:

我需要编写 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 BY project_structure ', [employee_id,tree_id,project_structure,select_year,select_month] )
sum1=str(cursor.fetchone())

但它告诉no such function: year我的代码有什么问题?

【问题讨论】:

  • 您的栏目名称是年份?
  • 没有列名是日期
  • 你有什么数据库作为你的后端?
  • sqlite 数据库现在稍后我将更改为 mysql
  • @Lahiruzz 那你为什么要标记mysql?而且我认为 SQLite 没有YEAR() 功能。

标签: django sqlite


【解决方案1】:

SQLite doesn't have a YEAR() function。如果你想要年份,你可以使用这样的东西 -

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 进行转义。

【讨论】:

  • 我需要从表中过滤年份吗?有什么功能吗?
  • 现在我得到 :unsupported format character 'Y' (0x59) at index 140 我不知道为什么:(
  • 尝试"%Y" 而不是'%Y'。你的终端是单引号的。
  • 同样的错误。这是我的查询:: 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。请阅读文档。
【解决方案2】:

为什么不使用 ORM?

如果你有这样的模型:

class Work(models.Model):
    date_field = models.DateField()
    # your other fields

您可以使用year 和month 查找来执行此查询:

Work.objects.filter(date_field__year=2013,date_field__month=2)

现在,添加其余内容,即 work_time 和分组依据的总和:

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

【讨论】:

  • OP 可能只是查询一些他们没有建模的表。
  • @Burhan : Group by 有什么功能吗?
  • values@Lahiruzz
  • @Burhan:您能帮我将这些总和值分配给某个变量吗? var=total 正确吗?
  • @Lahiruzz 已阅读手册的this section;希望这能回答这个问题和其他任何问题。
猜你喜欢
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 2014-03-10
相关资源
最近更新 更多