You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中正确实现MongoDB日期范围查询?

解决MongoDB时间段查询无结果的问题

我来帮你排查下问题所在,主要有两个核心错误导致你查不到结果:

1. 查询条件的逻辑对应完全搞反了

你的需求是数据库的startdate ≤ 输入的结束日期,且数据库的enddate ≥ 输入的起始日期,但你写的查询里,把数据库的startdate和输入的起始日期做了$lte,把数据库的enddate和输入的结束日期做了$gte,这完全不符合你的查询逻辑,自然匹配不到数据。

2. UTCDatetime的时间戳单位错误

MongoDB\BSON\UTCDatetime要求传入的是毫秒级的时间戳,而strtotime()函数返回的是秒级时间戳,直接传入的话,相当于把日期转换成了1970年左右的时间,和你数据库里的2018年数据完全不匹配。

修正后的完整代码

首先正确转换输入日期为MongoDB需要的UTCDatetime:

// 把输入的起始日期转成毫秒级时间戳,再实例化UTCDatetime
$inputStartDatetime = new MongoDB\BSON\UTCDatetime(strtotime($_POST['startdate'] . " 00:00:00") * 1000);
// 把输入的结束日期转成毫秒级时间戳,再实例化UTCDatetime
$inputEndDatetime = new MongoDB\BSON\UTCDatetime(strtotime($_POST['enddate'] . " 00:00:00") * 1000);

然后构造符合逻辑的查询条件:

$query = [
    'startdate' => ['$lte' => $inputEndDatetime], // 数据库的startdate ≤ 输入的结束日期
    'enddate' => ['$gte' => $inputStartDatetime]  // 数据库的enddate ≥ 输入的起始日期
];

额外验证技巧

如果还是不确定,可以把转换后的UTCDatetime转成可读日期验证一下:

// 打印转换后的日期,确认是否和输入一致
echo $inputStartDatetime->toDateTime()->format('Y-m-d H:i:s');

这样调整后,应该就能正确查询到符合时间段条件的数据了。

内容的提问来源于stack exchange,提问作者Diego de Lima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:30:15