在教义2中的日期之间选择条目

2022-08-30 09:27:15

我会发疯这个最小的错误,我没有得到修复。我想在两天之间选择条目,下面的例子说明了我所有的失败:

选项 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不是问题所在。从保留r0_ WHERE r0_.fecha > 2012 - 07


答案 1

你可以做任何一个...

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

或。。。

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

答案 2

我相信正确的方法是使用查询生成器表达式:

$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

编辑:这种方法相对于这里的任何其他答案的优势在于它是独立于数据库软件的 - 你应该让Tonic 处理日期类型,因为它有一个抽象层来处理这类事情。

例如,如果您以“Y-m-d”的形式添加字符串变量之类的操作,那么当它进入MySQL以外的数据库平台时,它将中断。

---另一个例子:

此示例通过使用大于和小于方法创建一个介于两者之间的条件。

if ($updateDateTime instanceof DateTime) {
    $qb->andWhere(
        $qb->expr()->gte('c.updated', ':updateDateTimeStart'),
        $qb->expr()->lt('c.updated', ':updateDateTimeEnd'),
    );

    $updateDateTimeImmutable = DateTimeImmutable::createFromMutable($updateDateTime);
    $start = $updateDateTimeImmutable->setTime(0,0,0, 0);
    $end = $start->modify('+1 day');

    $qb->setParameter('updateDateTimeStart', $start, Types::DATE_IMMUTABLE);
    $qb->setParameter('updateDateTimeEnd', $end, Types::DATE_IMMUTABLE);
}

推荐