django:datediff sql查询?

问题描述:

我试图做在Django以下SQL相当于:django:datediff sql查询?

SELECT * FROM申请人WHERE date_out - date_in> = 1 AND date_out - date_in < = 6

我能做到这一点的RAW sql查询,但这在处理RawQuerySet而不是常规QuerySet对象时变得令人沮丧,因为我希望能够稍后在代码中对其进行过滤。

您可以使用extra()方法并传入where关键字参数。 where的值应该是包含上述查询的SQL WHERE子句的列表。我在PostgreSQL 8.4测试这一点,这就是它看起来像我的情况:

q = Applicant.objects.extra(where = ["""date_part('day', age(date_out, date_in)) >= 1 and 
     date_part('day', age(date_out, date_in)) <= 6"""]) 

这将返回一个有效的QuerySet实例。

+0

非常好,谢谢! – tufelkinder 2010-10-12 15:41:11

我遇到了Django问题,并没有本地支持Datediff(和其他数据库等效项),并且需要为特定项目多次使用这样的函数。

经过进一步阅读,很明显,从两个日期计算间隔的实现在主要数据库风格之间差异很大。这可能是为什么它在Django中没有获得本地抽象函数。所以我写了我自己的Django的ORM功能datediff

参见:mike-db-tools Github repository

你会看到写在文档字符串各个数据库的数据库后端之间的不同语法。 Datediff支持sqlite,MySQL/MariaDB,PostgreSQL和Oracle。

使用(Django的1.8+):

from db_tools import Datediff 

# Define a new dynamic fields to contain the calculated date difference 
applicants = Applicant.objects.annotate(
    days_range=Datediff('date_out','date_in', interval='days'), 
) 

# Now you can use this dynamic field in your standard filter query 
applicants = applicants.filter(days_range__gte=1, days_range__lte=6) 

我真的很derpy当涉及到我的代码,所以我鼓励你叉子和提高。