基于一天的开始日期和结束日期的Django过滤器

时间:2019-11-18 01:08:50

标签: mysql django

我有一个查询

start_date = '2019-11-17'
end_date = '2019-11-18'

events = Event.objects.filter(start_date__gte=start_date,end_date__lte=end_date)

这不返回任何结果。。我尝试直接mysql查询,即使这也不返回任何结果,

SELECT * FROM `events` where start_date >= '2019-11-17' and end_date <= '2019-11-18'

知道我错了吗?

在我的数据库中,我有这三行,

enter image description here

这有效,

SELECT * FROM `events` where start_date > '2019-11-17' and end_date < '2019-11-19'

但是为什么不 <='2019-11-18'?有什么主意吗?

我设法在结束日期上增加了1天来解决它。

我的解决方案

start_date = datetime.fromtimestamp(start_date/1000.0)
end_date = datetime.fromtimestamp(end_date/1000.0)

start_date = start_date.strftime('%Y-%m-%d')
end_date = (end_date + timedelta(days=1)).strftime('%Y-%m-%d')

现在可以正常工作

events = Event.objects.filter(start_date__gt=start_date,end_date__lt=end_date)

2 个答案:

答案 0 :(得分:1)

您的日期已超过2019-11-18,请将您的datetime列转换为date

SELECT * FROM `events` where cast(start_date as date) >= '2019-11-17' and cast(end_date as date) <= '2019-11-18'

如果您要对下面的表达式求值,它将return 0

select cast('2019-11-18 16:23:01' as datetime)  <= '2018-11-18'

答案 1 :(得分:0)

或者您可以使用Django Queryset仅按日期过滤datetime字段:

events = Event.objects.filter(start_date__date__gte=start_date, end_date__date__lte=end_date)

https://docs.djangoproject.com/en/2.2/ref/models/querysets/#date