django:datediff sql查询?

时间:2010-10-11 03:33:07

标签: sql django datediff

我正在尝试在Django中执行以下SQL的等效操作:

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

我可以将其作为RAW sql查询来执行此操作,但是在处理RawQuerySet而不是常规QuerySet对象时这会变得令人沮丧,因为我希望以后能够在代码中对其进行过滤。

2 个答案:

答案 0 :(得分:2)

您可以使用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实例。

答案 1 :(得分:1)

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

进一步阅读后,很明显,计算两个日期的间隔的实现在主要数据库风格之间差异很大。这可能就是为什么它还没有Django的原生抽象功能。所以我为datediff编写了自己的Django ORM函数:

请参阅: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)

关于我的代码,我真的很狡猾,所以我鼓励你分叉和改进。