在原则Querybuilder中使用'DATE()'

在原则Querybuilder中使用'DATE()',date,datetime,doctrine-orm,doctrine,query-builder,Date,Datetime,Doctrine Orm,Doctrine,Query Builder,我需要获取所有与字符串2014-09-30匹配的DATE(a.when)行 $builder = $this->em->createQueryBuilder(); $builder->select('a') ->from('Entity\Appointment', 'a') ->andWhere('a.when = :date') ->setParameter('date', $date); a.当是完整的日期

我需要获取所有与字符串
2014-09-30
匹配的
DATE(a.when)

$builder = $this->em->createQueryBuilder();
$builder->select('a')
        ->from('Entity\Appointment', 'a')
        ->andWhere('a.when = :date')
        ->setParameter('date', $date);
a.当
是完整的
日期时间时
<代码>:日期只是一个
字符串
(以
日期
格式)

以下内容和变体不起作用:

        ->andWhere('DATE(a.when) = :date')

Error: Expected known function, got 'DATE'

这里的正确用法是什么?

这实际上是一个非常常见的问题。 事实证明,并非所有的sql数据库都支持日期函数,因此负责该理论的优秀人员决定不在本地支持它

他们希望这样做,因为这样可以节省很多人的精力

因此,将这个相当神奇的类添加到您的项目中:

namespace Cerad\Bundle\CoreBundle\Doctrine\DQL;

use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;

class Date extends FunctionNode
{
    public $date;

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return "DATE(" . $sqlWalker->walkArithmeticPrimary($this->date) . ")";
    }
    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);

        $this->date = $parser->ArithmeticPrimary();

        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }
}
然后将其连接到应用程序/config.yml的条令部分:

doctrine:
  orm:
  default_entity_manager:       default
  auto_generate_proxy_classes: %kernel.debug%

  entity_managers:

    default:
      connection: default
      ...
      dql:
        datetime_functions:
          date:  Cerad\Bundle\CoreBundle\Doctrine\DQL\Date

还有其他一些包包含更多的sql函数。奇怪的是,几年前我第一次看的时候,没有一个是有日期定义的。所以我自己做了

====================================================================

更新01

我没有仔细检查标签,并假设这是一个Symfony 2应用程序。Date类保持不变。您可以通过获取条令配置对象来连接它

$config = new \Doctrine\ORM\Configuration();
$config->addCustomDatetimeFunction('DATE', 'blahblah\Date');

有关详细信息,请查看条令链接。

感谢andy,现在就使用它:

$builder = $this->em->createQueryBuilder();
$builder->select('a')
        ->from('Entity\Appointment', 'a')
        ->andWhere('a.when >= :date_start')
        ->andWhere('a.when <= :date_end')
        ->setParameter('date_start', $date->format('Y-m-d 00:00:00'))
        ->setParameter('date_end',   $date->format('Y-m-d 23:59:59'));
$builder=$this->em->createQueryBuilder();
$builder->select('a')
->from('实体\约会','a')
->andWhere('a.when>=:date\u start')

->andWhere('a.when在同一andWhere中使用$qb->expr()->between()的不同方法:


    $builder = $this->em->createQueryBuilder(); $builder->select('a')
                ->from('Entity\Appointment', 'a')
                ->andWhere($qb->expr()->between('a.when', ':date_start', ':date_end'))
                ->setParameter('date_start', $date->format('Y-m-d 00:00:00'))
                ->setParameter('date_end',   $date->format('Y-m-d 23:59:59'));


@andy的可能重复项不是重复项。我使用的是queryBuilder,错误消息使用的是
createQuery
,而
queryBuilder
是相同的:
错误:预期已知函数,得到了“DATE”
。错误是相同的,因为没有
DATE()
在DQL中。如果您使用链接副本中的WHERE子句,您的方法也应该起作用。我对您的努力给予支持,不幸的是,我不能像原则一样更改我们的核心库。在找到更好的方法之前,我现在使用非DQL方法。您没有更改核心库。您只是添加了一个自定义函数。什么都没有条令内部正在更改。我无法“连接”。我没有此配置文件。我尝试了
YEAR()
DAY()
MONTH()
现在,因为他们的类文件已经存在,但错误是相同的。请参阅我的更新。只需将其添加到您的条令配置对象。啊,好的,这一次它工作了,我们将条令连接到ZF1。答案不正确。a.where Caluse应使用闭合间隔(>=&@Arkadiusz'flies'Rzadkowolski,所以你投了反对票,因为我做了
我编辑了你的答案并删除了反对票。但我不同意这是一个小细节。封闭/开放的间隔在现实生活中很重要:)这应该是
modify('+1天')->格式('Y-m-d 00:00')当数据库可能或可能不考虑微秒,这可能意味着<代码> DATEYOND <代码>在23:59:59:200不被考虑。你能对你正在共享的代码添加一点解释,你正在做什么,以及它是如何不同的方法?