60

私は修正されていないこの最小限のエラーで狂気になります。2日間のエントリを選択したいのですが、以下の例はすべての失敗を示しています。

オプト1。

$qb->where('e.fecha > ' . $monday->format('Y-m-d'));
$qb->andWhere('e.fecha < ' . $sunday->format('Y-m-d'));

結果(0エントリ):

SELECT r0_.id_reservacion AS id_reservacion0, r0_.fecha AS fecha1, r0_.cliente AS cliente2 
FROM reservacion r0_ 
WHERE (r0_.fecha > 2012 - 07 - 16) AND (r0_.fecha < 2012 - 07 - 22)

オプト2

$qb->add('where', 'e.fecha between 2012-01-01 and 2012-10-10');

結果(0エントリ):

SELECT r0_.id_reservacion AS id_reservacion0, r0_.fecha AS fecha1, r0_.cliente AS cliente2 
FROM reservacion r0_ WHERE r0_.fecha 
BETWEEN 2012 - 01 - 01 AND 2012 - 10 - 10

これは、現在のエントリを含む私のテーブルです。

id      fecha            cliente
1   2012-07-16 00:00:00    2    
2   2012-07-16 13:00:00    4    
3   2012-07-22 23:00:00    4

編集1

疑いを避けるためにSQLを評価するために、私はこのクエリを実行しました:

$qb->where('e.fecha > ' . $sunday->format('Y-m-d'));

結果(3エントリ):

SELECT r0_.id_reservacion AS id_reservacion0, r0_.fecha AS fecha1, r0_.cliente AS cliente2 

したがって、SQLは問題ではないように見えます。FROM予約r0_WHEREr0_.fecha> 2012-07

4

4 に答える 4

161

どちらでもできます…</p>

$qb->where('e.fecha BETWEEN :monday AND :sunday')
   ->setParameter('monday', $monday->format('Y-m-d'))
   ->setParameter('sunday', $sunday->format('Y-m-d'));

または…</p>

$qb->where('e.fecha > :monday')
   ->andWhere('e.fecha < :sunday')
   ->setParameter('monday', $monday->format('Y-m-d'))
   ->setParameter('sunday', $sunday->format('Y-m-d'));
于 2012-09-14T20:27:47.227 に答える
44

それを行う正しい方法は、クエリビルダー式を使用することだと思います。

$now = new DateTimeImmutable();
$thirtyDaysAgo = $now->sub(new \DateInterval("P30D"));
$qb->select('e')
   ->from('Entity','e')
   ->add('where', $qb->expr()->between(
            'e.datefield',
            ':from',
            ':to'
        )
    )
   ->setParameters(array('from' => $thirtyDaysAgo, 'to' => $now));

http://docs.doctrine-project.org/en/latest/reference/query-builder.html#the-expr-class

編集:この方法がここでの他のどの答えよりも優れているのは、データベースソフトウェアに依存しないことです。この種のものを処理するための抽象化レイヤーがあるため、Doctrineに日付型を処理させる必要があります。

文字列変数を「Ymd」の形式で追加するようなことをすると、たとえば、MySQL以外のデータベースプラットフォームに移動すると壊れます。

于 2013-07-27T21:43:59.567 に答える
3

    編集:より良い解決策については他の回答を参照してください

私が提供した最初の初心者のアプローチは(opt1)でした:

$qb->where("e.fecha > '" . $monday->format('Y-m-d') . "'");
$qb->andWhere("e.fecha < '" . $sunday->format('Y-m-d') . "'");

そして(opt2):

$qb->add('where', "e.fecha between '2012-01-01' and '2012-10-10'");

それは迅速かつ簡単で、元のポスターがすぐに公開されました。

したがって、受け入れられた答え。

コメントによると、それは間違った答えですが、それは簡単な間違いなので、ここでは「してはいけないこと」として残しておきます。

于 2012-07-19T02:51:35.397 に答える
1

パラメータで日付$jourをフォーマットする方法を見てください。expr()-> likeまたはexpr()->lteのどちらを使用するかによって異なります

$qb
        ->select('e')
        ->from('LdbPlanningBundle:EventEntity', 'e')
        ->where(
            $qb->expr()->andX(
                $qb->expr()->orX(
                    $qb->expr()->like('e.start', ':jour1'),
                    $qb->expr()->like('e.end', ':jour1'),
                    $qb->expr()->andX(
                        $qb->expr()->lte('e.start', ':jour2'),
                        $qb->expr()->gte('e.end', ':jour2')
                    )
                ),
                $qb->expr()->eq('e.user', ':user')
            )
        )
        ->andWhere('e.user = :user ')
        ->setParameter('user', $user)
        ->setParameter('jour1', '%'.$jour->format('Y-m-d').'%')
        ->setParameter('jour2', $jour->format('Y-m-d'))
        ->getQuery()
        ->getArrayResult()
    ;
于 2017-08-16T22:25:02.067 に答える