在 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 查询集中的两个日期之间有可能获得几个月?的主要内容,如果未能解决你的问题,请参考以下文章