django时间范围查询居然不包括end_date?必须往后面加一天才行?

result =AmazonHistoryPrice.objects.filter(identification=identification,created_at__range=[start_date, end_date]).order_by('created_at').all()
CREATE TABLE "amazon_app_amazonhistoryprice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "month" integer NOT NULL, "day" integer NOT NULL, "identification" text NOT NULL, "price" integer NOT NULL, "year" integer NOT NULL, "created_at" datetime NULL);
import requests

url = "127.0.0.1/api/amazon/get_history_price"

payload={'identification': 'B0BF9LBYXJ',
'start_date': '2023-2-20',
'end_date': '2023-2-23'}
files=[

]
headers = {}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)
阅读 2.3k
2 个回答

在 Django 中进行时间范围查询时,确实需要注意一些细节,特别是涉及到日期的比较时。如果你使用的是 Django 的 filter() 方法进行查询,通常是使用 __range 参数指定时间范围,如下所示:

from django.db.models import Q
from datetime import datetime, timedelta

start_date = datetime(2022, 1, 1)
end_date = datetime(2022, 1, 31)

query = Q(date__range=(start_date, end_date))
results = MyModel.objects.filter(query)

在上述代码中,date__range 参数用于指定查询的时间范围,其中包含 start_date 和 end_date 两个日期。但需要注意的是,这里的时间范围是左闭右闭的,也就是说,查询的结果将包括起始时间和结束时间这两个时间点。

如果你想要查询的时间范围是左闭右开的,即包含起始时间但不包含结束时间,可以将结束时间加上一天,如下所示:

from django.db.models import Q
from datetime import datetime, timedelta

start_date = datetime(2022, 1, 1)
end_date = datetime(2022, 2, 1) - timedelta(days=1)

query = Q(date__range=(start_date, end_date))
results = MyModel.objects.filter(query)

在上述代码中,我们将 end_date 减去一天,得到一个新的日期,作为查询的结束时间。这样就可以实现左闭右开的时间范围查询了。

不太清楚的你调用的API是怎么规定的,是不是不指定时间,就是2023-2-23 00:00:00
如果是,就是要指定时间 2023-2-23 23:59:59

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题