Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2条令查询-日期时间添加_Php_Mysql_Symfony_Doctrine Orm_Doctrine - Fatal编程技术网

Php Symfony2条令查询-日期时间添加

Php Symfony2条令查询-日期时间添加,php,mysql,symfony,doctrine-orm,doctrine,Php,Mysql,Symfony,Doctrine Orm,Doctrine,我目前面临一个小问题:我有一个事件表,想知道哪些事件即将发生或正在发生 例如,我们在周一的12:00,我们计划了今天的3个活动: 事件A从10:00开始,持续1小时 事件B从11:00开始,持续2小时 事件C从13:00开始,持续2小时 最后,我希望看到事件B(正在进行)和事件C(即将进行) 我试过这样做(没有成功): 我四处搜索,找到了SQL ADDTIME()函数。我很想做一个where('ADDTIME(event.startTime,event.duration)>=:time'),

我目前面临一个小问题:我有一个事件表,想知道哪些事件即将发生或正在发生

例如,我们在周一的12:00,我们计划了今天的3个活动:

  • 事件A从10:00开始,持续1小时

  • 事件B从11:00开始,持续2小时

  • 事件C从13:00开始,持续2小时

最后,我希望看到事件B(正在进行)和事件C(即将进行)

我试过这样做(没有成功):

我四处搜索,找到了SQL ADDTIME()函数。我很想做一个where('ADDTIME(event.startTime,event.duration)>=:time'),但这并不是教义所认可的


没有残酷的本机SQL,有什么合适的方法可以做到这一点吗?

您可以使用Doctrine的
DATE\u ADD()
函数:

public function findAllPast(\Datetime $datetime) 
{
    $query = $this->createQueryBuilder('event')
        ->where('DATE_ADD(event.startTime, event.duration, "days") >= :time')
        ->setParameter('time', $datetime)
        ->getQuery();

    return $query->getResult();    
}
当然,这假设
event.duration
以天为单位

编辑:PHP中使用
DateTime
对象的替代方法

如果
$duration
以秒为单位,您可以简单地:

$datetime->sub(new DateInterval('PT' . $durationInSeconds . 'S')); // or ->add(), depending on what you wnat
然后使用:

public function findAllPast(\Datetime $datetime) 
{

    $datetime->sub(new DateInterval('PT' . $durationInSeconds . 'S'));

    $query = $this->createQueryBuilder('event')
        ->where('event.startTime >= :time')
        ->setParameter('time', $datetime)
        ->getQuery();

    return $query->getResult();    
}

好的,这里有一个使用$duration作为时间域的工作解决方案(对于问题的形式部分来说更简单):一个自定义查询

   $entityManager = $this->getEntityManager();

    $rsm = new ResultSetMappingBuilder($entityManager);
    $rsm->addRootEntityFromClassMetadata('Ormindo\EventBundle\Entity\Event', 'event');

    $sql = " 
    SELECT *
      FROM events
      WHERE ADDTIME(startTime, duration) > '" . $datetime->format("Y-m-d H:i:s") ."'"
    ;

    $query = $entityManager->createNativeQuery($sql, $rsm);

    return $query->getResult();
别忘了使用

use Doctrine\ORM\Query\ResultSetMappingBuilder;

谢谢您的时间和快速回复:)

谢谢,这正是我要找的东西。现在,“duraton”字段在我的数据库中是时间类型的,所以我需要将其转换为秒。是否有办法修改event.duration字段,例如将其设置为参数并执行类似于->setParameter('duration',strotTime($duration))的操作?您的
duration
字段不应是时间类型,因为它是一个间隔。您应该将其存储为int(以秒为单位)。你的问题解决了;)你说得对,我要改变这个。谢谢大家!Welp,DATE_ADD()只支持天和月:(好吧,你可以
$duration=$duration/86400
并使用
“days”
作为技巧;)-查看我的更新答案没问题!如果有帮助的话,考虑一下我的回答吧。也接受你自己的答案
use Doctrine\ORM\Query\ResultSetMappingBuilder;