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
实例。
答
我遇到了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当涉及到我的代码,所以我鼓励你叉子和提高。
非常好,谢谢! – tufelkinder 2010-10-12 15:41:11