如何比较Doctrine2的日期时间字段和日期?

gpe*_*ard 12 datetime symfony doctrine-orm

我想通过Doctrine2的QueryBuilder获取今天创建的项目.我想将createdAt(Datetime)字段与今天参数(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
Run Code Online (Sandbox Code Playgroud)

stw*_*twe 22

一个想法是从日期中提取:年,月和日.然后

$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);
Run Code Online (Sandbox Code Playgroud)

每月和你从中取出DoctrineExtensions

例如

DoctrineExtensions

这适合我.你只需要文件:day.php,month.php和year.php .....

你得到这个月,例如:

    $datetime = new \DateTime("now");
    $month = $datetime->format('m');
    echo $month;
Run Code Online (Sandbox Code Playgroud)

将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
Run Code Online (Sandbox Code Playgroud)

  • 它工作,但它有点脏.你知道QueryBilder的DATE()函数是否提供了这个包吗? (2认同)

Jas*_*ngh 16

比添加日期的学说扩展更好的选择.

首先,您需要获取start-datetime和end-datetime:

$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") );
Run Code Online (Sandbox Code Playgroud)

现在在查询中使用它们:

$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 ();
Run Code Online (Sandbox Code Playgroud)

  • 最好的答案在这里! (3认同)

Pab*_*ela 13

这种成熟的ORM很少能提供这种DATE 功能.但是,要从datetime字段中获取日期,您可以应用如下SUBSTRING函数:

SELECT SUBSTRING(i.dateTimeField,1,10) FROM tableName i
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!


Vit*_*ian 12

也可以使用内置函数DATE_DIFF(date1, date2)来返回天数差异.检查文档

$result = $this->createQueryBuilder('l')
    ->where('DATE_DIFF(l.startDate, CURRENT_DATE()) = 0')
Run Code Online (Sandbox Code Playgroud)


Reu*_*ven 5

您必须在查询中添加QueryBuilder today参数.

$today = new \DateTime();
$qb->setParameter('today', $today->format('Y-m-d'));
Run Code Online (Sandbox Code Playgroud)

使用QueryBuilder,您可以将日期与DateTime与格式进行比较 'Y-m-d'