在 django 查询集中的两个日期之间有可能获得几个月?

Posted

技术标签:

【中文标题】在 django 查询集中的两个日期之间有可能获得几个月?【英文标题】:its possible to get months between two dates in django queryset? 【发布时间】:2018-09-26 04:07:38 【问题描述】:

我正在尝试创建一个完整的查询集,现在我需要的是从我的模型中获取两个 DateTime 字段之间的月份,可以在单个查询集中执行此操作。 我不是在谈论过滤器,例如在模型中我有两个datetimeField(),现在我想做的是,在这个日期之间有几个月的时间。

【问题讨论】:

Django database query: How to filter objects by date range?的可能重复 如果您执行date1 - date2,您应该会在几秒钟内得到差异,然后您可以在结果上使用strftime 函数来获得月份 【参考方案1】:

如果您的数据库支持DurationField,您可以使用ExtractMonth:

from django.db import models
from django.db.models.functions import ExtractMonth

queryset = MyModel.objects.annotate(
    diff=models.ExpressionWrapper(
        models.F('date1') - models.F('date2'), output_field=models.DurationField())
    ).annotate(months=ExtractMonth('diff'))

【讨论】:

【参考方案2】:

给定的答案在 postgres 上对我不起作用,因为 diff 字段 (DurationField) 仅支持 Extract days 函数。 ExtractMonth 返回“0”。

这里是我找到的解决方案:

queryset = MyModel.objects.annotate(
    months=(ExtractYear("date2") - ExtractYear("date1")) * 12 + (ExtractMonth("date2") - ExtractMonth("date1"))
)

请注意,它只考虑每个月的第一天之间的差异,而不是天数给出的最终小数部分。在这个解决方案中,2020-08-12 被认为与 2020-08-01 相同。

【讨论】:

以上是关于在 django 查询集中的两个日期之间有可能获得几个月?的主要内容,如果未能解决你的问题,请参考以下文章

查找大型数据集中的两个日期之间是不是有假期?

计算两个日期之间的差异并获得年值? [复制]

利用SQL语句如何获得两个日期之间相差的天数

Django 在查询集中添加一个字段

利用SQL语句如何获得两个日期之间相差的天数

使用java在sqlite中选择两个日期之间的行