带日期的 in() 表达式的学说

Posted

技术标签:

【中文标题】带日期的 in() 表达式的学说【英文标题】:Doctrine equivalent of in() expression with dates 【发布时间】:2020-01-31 21:49:48 【问题描述】:

使用 Doctrine 的 QueryBuilder,我尝试在日期数组上使用 in() 方法,但我发现它只允许字符串值。

/** @param DateTime[] $dates */
public function findByDate(array $dates): array 
    $qb = $this->createQueryBuilder('Event');
    $qb->andWhere($qb->expr()->in('Event.date', ':dates'));
    $qb->setParameter('dates', $dates);
    return $qb->getQuery()->getResult();

使用参数 ["date":"2020-01-31 00:00:00.000000","timezone_type":3,"timezone":"Europe/ 执行 'SELECT [...]' 时发生异常柏林"]: 可捕获的致命错误:DateTimeImmutable 类的对象无法转换为字符串

是否有任何简单的等价于 in() 函数的日期? (最好不要使用 DQL)

【问题讨论】:

Related. 我建议使用 kejwmen 那里建议的array_map 方法。很简单。 @Jeto 当然...但是我们可以确定Y-m-d H:i:s 格式适用于任何数据库实现/发行版/设置(它是一种 SQL 标准吗?),或者它可能会因数据库服务器? 当然,这种方式可能不太便携。我对 Doctrine 知之甚少,但可能有一种方法可以强制列的日期格式,然后在执行上述操作时可能会检索它。无论如何,您的解决方案对我来说看起来不错(您可能想尝试使其更通用并将其发布在该 github 问题上)。 好主意 :) 添加了对该问题的评论 【参考方案1】:

这是我想出的解决方案,循环遍历 php 数组,构建另一个 eq() 表达式数组,然后 oring 一切。 它完成了它的工作,但需要在数组中为每个日期声明一个参数,而不是单个数组参数。

如果你找到更好的方法,请告诉我...

/** @param DateTime[] $dates */
public function findByDate(array $dates): array 
    $qb = $this->createQueryBuilder('Event');
    $criteria = [];
    for($i = 0; $i < count($dates); $i++) 
        $criteria[] = $qb->expr()->eq('Event.date', ":date_$i");
        $qb->setParameter("date_$i", $dates[$i]);
    
    $qb->andWhere($qb->expr()->orX()->addMultiple($criteria));
    return $qb->getQuery()->getResult();

【讨论】:

以上是关于带日期的 in() 表达式的学说的主要内容,如果未能解决你的问题,请参考以下文章

ACCEss表中要设置默认值:DATE()结果是例:2011-8-29,我想要带时间的,例2011-8-29 5:45:12

4.有关日期格式属性改动常识,v$nls_parameters,between and,查询指定部门的员工信息,in和null,like模糊查询,order by后面能够跟:列名表达式别名序号

SqlServer函数的类型转换函数

正则表达式匹配日期,支持闰年,格式为YYYYMMDD

Rails - 带日期的 best_In_place gem

如何在 SQL Server中 将日期格式化