2014-03-31 18 views
2

有人能指出此查詢中缺少的是什麼嗎?本月的最後一天不會出現。Doctrine2 - 如何在該查詢中包含月份的最後一天

已經嘗試使用( - >在哪裏( 'b.created> =:開始'), - > andWhere( 'b.created < =:' 端),而不是之間,而是沒有工作

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); 

回答

2

你見過在數據庫上執行的實際查詢?

看來你使用的是相同的DateTime ;當你做一個$ 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對象,讓做學說的辛勤工作引擎蓋下:如上圖所示

$query = $qb 
    ->where('b.created BETWEEN :start AND :end') 
    ->setParameter('start', $date) 
    ->setParameter('end', $toDate) 
; 
+0

所做的更改,而該月的最後一天,仍然沒有出現。 –

+0

嘗試'$ toDate->修改(「下個月午夜的第一天」);' –

+0

賓果!這就是訣竅,謝謝阿爾貝託的迴應和改進建議。你能編輯你的答案嗎? –

相關問題