Php Symfony2条令查询-日期时间添加
我目前面临一个小问题:我有一个事件表,想知道哪些事件即将发生或正在发生 例如,我们在周一的12:00,我们计划了今天的3个活动: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'),
- 事件A从10:00开始,持续1小时
- 事件B从11:00开始,持续2小时
- 事件C从13:00开始,持续2小时
没有残酷的本机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;