【问题标题】:How to bind datetime field between two string value如何在两个字符串值之间绑定日期时间字段
【发布时间】:2016-11-08 11:12:08
【问题描述】:

我有这样的方法:

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" (string)

$endDay 等于 "2016-10-03 00:00:00" (string)

还有order.createdorder 的字段之一)是日期时间

我想从创建字段介于$startDay$endDay 之间的订单实体获取订单。如何解决?

【问题讨论】:

    标签: php mysql datetime doctrine-orm


    【解决方案1】:

    使用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();
    }
    

    【讨论】:

      【解决方案2】:

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

      使用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 之后和 end 日期之前创建的行。

      更好的方法可能是将您的字符串转换为日期,并像 sugested 一样使用 between

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-29
        • 2016-07-10
        • 2021-11-20
        相关资源
        最近更新 更多