如何在两个字符串值之间绑定datetime字段

时间:2016-11-08 11:12:08

标签: php mysql datetime doctrine-orm

我有这样的方法:

public function getCustomDateOrders(string $startDay,string $endDay,string $food) :array
{
    $result = $this->_em->createQueryBuilder()
        ->select
        (
            'OrderEntity.name'
            'OrderEntity.created'
        )
        ->from($this->entityClass , 'OrderEntity')
        ->leftJoin(
            'Directory\Food',
            'Food',
            'with',
            'Food.id = OrderEntity.FoodId '
        )
        ->where("Food.id =:food")
        ->andWhere("OrderEntity.status =:active")
        ->andWhere("startDate<:OrderEntity.orderCreated >:endDay")
        ->getQuery()
        ->setParameters([
            "food"    =>       $food,
            "active"        =>  1,
            "startDate"     =>  $startDay,
            "endDay"        =>  $endDay
        ])
        ->getScalerResult();

        ->getScalarResult();

}

我有几个价值观:

$ startDay 等于"2016-010-17 00:00:00" (字符串)

$ endDay 等于"2016-10-03 00:00:00" (字符串)

另外order.createdorder个字段之一)是 datetime

我想从订单实体获取订单,其中已创建的字段位于$startDay$endDay之间。怎么解决?

2 个答案:

答案 0 :(得分:2)

使用between

public function getCustomDateOrders(string $startDay,string $endDay,string $food) :array
{
    $result = $this->_em->createQueryBuilder()
        ->select
        (
            'OrderEntity.name'
            'OrderEntity.created'
        )
        ->from($this->entityClass , 'OrderEntity')
        ->leftJoin(
            'Directory\Food',
            'Food',
            'with',
            'Food.id = OrderEntity.FoodId '
        )
        ->where("Food.id =:food")
        ->andWhere("OrderEntity.status =:active")
        ->andWhere("OrderEntity.orderCreated between :startDay and :endDay")
        ->setParameters([
            "food"    =>       $food,
            "active"        =>  1,
            "startDay"     =>  $startDay,
            "endDay"        =>  $endDay
        ])
       ->getQuery()
       ->getScalerResult();
}

答案 1 :(得分:0)

这就是为什么我们不将日期存储为字符串。您仍然可以在查询中转换字符串,因此请不要关闭计算机。

使用str_to_date() function

让我们把它翻译成SQL:

select * from yourtable
where created > str_to_date(start_day, '%Y-%m-%d %H:%i:%s')
and created < str_to_date(end_day, '%Y-%m-%d %H:%i:%s')

我们走了。给我在start_date之后和结束日期之前创建的所有行。

更好的方法可能是将您的字符串转换为日期,并使用之间的,如同sugested一样。