Django DateTimeField过滤无结果:预期5条数据却返回空
问题排查与解决
1. 时间字符串格式错误(最可能原因)
你写的时间字符串是'2022-07-26 2019:30:00',对应的格式符是'%Y-%m-%d %H:%M:%S',其中%H是24小时制的两位小时数(范围00-23),但字符串里的小时部分写成了2019(四位),这会导致strptime解析出完全错误的时间,甚至直接抛出异常。
正确的时间字符串应该是类似'2022-07-26 19:30:00'(假设小时是19点),对应格式符才能正确解析。
2. 查询条件逻辑不符合预期
当前查询条件是:
start_time__gte=开始时间, end_time__lte=结束时间
这要求记录的整个时间段完全落在查询区间内。如果你的数据是每分钟一条,比如每条记录的start_time是19:30:00、19:31:00...,end_time是19:31:00、19:32:00...,那么:
- 第一条记录
end_time=19:31:00满足lte=19:35:00,start_time=19:30:00满足gte=19:30:00,会被匹配 - 但如果你的查询结束时间是
19:35:00,最后一条记录的end_time如果是19:35:00才会被包含,若end_time是19:36:00则不会被匹配
如果你的需求是只要记录的时间段与查询区间有重叠,应该调整条件为:
example.objects.filter( name='John', start_time__lte=结束时间, end_time__gte=开始时间 )
3. 语法错误
你的查询语句中,start_time__gte这一行末尾缺少逗号,正确的写法应该是:
a = example.objects.filter( name='John', start_time__gte=datetime.datetime.strptime('2022-07-26 19:30:00','%Y-%m-%d %H:%M:%S'), end_time__lte=datetime.datetime.strptime('2022-07-26 19:35:00','%Y-%m-%d %H:%M:%S') )
缺少逗号会导致语法错误,不过如果代码能正常执行,可能是你输入时遗漏了。
验证步骤
- 先单独打印解析后的时间,确认是否正确:
start = datetime.datetime.strptime('2022-07-26 19:30:00','%Y-%m-%d %H:%M:%S') end = datetime.datetime.strptime('2022-07-26 19:35:00','%Y-%m-%d %H:%M:%S') print(start, end)
确保输出的时间是你预期的区间。
- 检查数据库中
name='John'的记录,确认它们的start_time和end_time是否真的落在(或重叠于)你要查询的区间内。
内容的提问来源于stack exchange,提问作者ijavadddd
相关产品推荐
相关产品推荐

