如何将Doctrine2中的datetime字段与日期进行比较?

如何将Doctrine2中的datetime字段与日期进行比较?,datetime,symfony,doctrine-orm,Datetime,Symfony,Doctrine Orm,我想从Doctrine2获取QueryBuilder今天创建的项。我想比较createdAt(Datetime)字段和today参数(Date)。可以在一个查询中完成吗 $qb = $this->createQueryBuilder('i'); $qb->innerJoin('i.type', 'it'); $qb->andWhere('it.name = :type'); $qb->andWhere('i.createdAt < :today'); // i.cr

我想从Doctrine2获取QueryBuilder今天创建的项。我想比较createdAt(Datetime)字段和today参数(Date)。可以在一个查询中完成吗

$qb = $this->createQueryBuilder('i');
$qb->innerJoin('i.type', 'it');
$qb->andWhere('it.name = :type');
$qb->andWhere('i.createdAt < :today');
// i.createdAt == datetime and :today parameter is a date
$qb=$this->createQueryBuilder('i');
$qb->innerJoin('i.type','it');
$qb->andWhere('it.name=:type');
$qb->andWhere('i.createdAt<:today');
//i.createdAt==日期时间和:today参数是日期

您今天必须将
参数添加到查询QueryBuilder中

$today = new \DateTime();
$qb->setParameter('today', $today->format('Y-m-d'));

使用QueryBuilder,您可以使用格式“Y-m-d”将日期与日期时间进行比较。一个想法是从日期中提取:年、月和日。然后

$qb->select('p')
   ->where('YEAR(p.postDate) = :year')
   ->andWhere('MONTH(p.postDate) = :month')
   ->andWhere('DAY(p.postDate) = :day');

$qb->setParameter('year', $year)
   ->setParameter('month', $month)
   ->setParameter('day', $day);
从中取出DoctrineExtensions的月份、日期和年份

e、 g

这对我有用。您只需要文件:day.php、month.php和year.php

您可以获得月份,例如:

    $datetime = new \DateTime("now");
    $month = $datetime->format('m');
    echo $month;
将day.php、month.php和year.php复制到您的捆绑包Xy\TestBundle\Dql中 将app\config.yml中的新函数注册为

doctrine:


orm:
    auto_generate_proxy_classes: %kernel.debug%
    entity_managers:
        default:
            auto_mapping: true
            dql:
                datetime_functions:
                    month: Xy\TestBundle\Dql\Month
                    year: Xy\TestBundle\Dql\Year
                    day: Xy\TestBundle\Dql\Day

如此成熟的ORM很少不提供
DATE
功能。但是,要从datetime字段中获取日期,可以像下面这样应用
子字符串
函数:

SELECT SUBSTRING(i.dateTimeField,1,10) FROM tableName i

希望有帮助

有比为日期添加条令扩展更好的选择

首先,您需要获取开始日期时间和结束日期时间:

$today_startdatetime = \DateTime::createFromFormat( "Y-m-d H:i:s", date("Y-m-d 00:00:00") );
$today_enddatetime = \DateTime::createFromFormat( "Y-m-d H:i:s", date("Y-m-d 23:59:59") );
现在在查询中使用它们:

$em = \Zend_Registry::get('em');
$qb_1 = $em->createQueryBuilder();
$q_1 = $qb_1->select('wsh')
    ->from('\Entities\wishes', 'wsh')
    ->where('wsh.created_at >= :today_startdatetime')
    ->andWhere('wsh.created_at <= :today_enddatetime');


$q_1->setParameter('today_startdatetime', $today_startdatetime);
$q_1->setParameter('today_enddatetime', $today_enddatetime);
$result= $q_1->getQuery ()->getResult ();
$em=\Zend_注册表::get('em');
$qb_1=$em->createQueryBuilder();
$q_1=$qb_1->选择('wsh')
->来自('\Entities\Wises','wsh')
->其中('wsh.created_at>=:today_startdatetime')

->和where('wsh.created_at也可以使用内置函数
DATE_DIFF(date1,date2)
,该函数以天为单位返回差值。检查


一个简单的解决方案是相应地格式化日期时间

public function getWithStartingPremium(\DateTime $datetime)
{
    $qb = $this->createQueryBuilder('c');

    return $qb
        ->innerJoin('c.collegePremium', 'cp')
        ->where($qb->expr()->eq('cp.start', ':date'))
        ->setParameters(array(
            'date' => $datetime->format('Y-m-d'),
        ))
        ->getQuery()
        ->getResult();
}

我尝试使用$today->format('Y-m-d')作为参数进行管理,但没有结果。我只需要为'createdAt'字段获取'Y-m-d'。您是否尝试直接将
DateTime
对象作为参数传递?是的,但这不是相同的值(当我比较它们时,得到的值为false)而且这也不是我想要的。我想要在同一天,但在任何时候创建的项目。I.createdAt=2012-05-21 13:18:27$today=2012-05-21 14:23:34它工作正常,但有点脏。你知道DATE()QueryBuilder的函数随此捆绑包一起提供?@jooyce没有。是扩展列表available@gperriard一点也不肮脏。只是基本的。Tks为您解答!帮助很大!有点黑客修复,直到日期函数得到条令支持!谢谢,这里是最好的答案!这是一个更直接的答案。遗憾的是ORM没有为此提供特定的功能
public function getWithStartingPremium(\DateTime $datetime)
{
    $qb = $this->createQueryBuilder('c');

    return $qb
        ->innerJoin('c.collegePremium', 'cp')
        ->where($qb->expr()->eq('cp.start', ':date'))
        ->setParameters(array(
            'date' => $datetime->format('Y-m-d'),
        ))
        ->getQuery()
        ->getResult();
}