有人可以指出此查询中缺少的内容吗?不会显示该月的最后一天。
尝试使用(->where('b.create>= :start'),->andWhere('b.create <= :end')代替BETWEEN 但这不起作用。
public function getPostsByMonth($year, $month)
{
$date = new DateTime("{$year}-{$month}-01");
$qb = $this->createQueryBuilder('b');
$query = $qb
->where('b.created BETWEEN :start AND :end')
->setParameter('start', $date->format('Y-m-d'))
->setParameter('end', $date->modify('last day of this month')->format('Y-m-d'))
;
return $query->getQuery()->getResult();
}
变化
$date = new DateTime("{$year}-{$month}-01");
$toDate = clone $date;
$toDate->modify("last day of this month");
$qb = $this->createQueryBuilder('b')
->where('b.created BETWEEN :start AND :end')
->setParameter('start', $date)
->setParameter('end', $toDate);
您是否看到在数据库上执行的实际查询?
看起来你使用相同的日期时间;当你执行$date->modify()时,它不会返回一个新对象,而是改变它的内部数据,但它仍然是相同的实例。
此外,当您要求 DateTime 对象转到last day of this month
时,您最终会进入YYYY-01-31 00:00:00
这实际上是月底前一天。更改您的时间字符串,使其转到下个月的第一天午夜,这正是您想要的地方:YYYY-02-01 00:00:00
:
$toDate = clone $date;
$toDate->modify("first day of next month midnight");
另外,你不需要格式化它,你可以直接传递 DateTime 对象,让 Doctrine 在引擎盖下完成艰苦的工作:
$query = $qb
->where('b.created BETWEEN :start AND :end')
->setParameter('start', $date)
->setParameter('end', $toDate)
;