Сделать Zend\Db (zf2) между предложением включительно

В настоящее время я использую Zend Framework 2 и запрос с диапазонами дат для получения данных из базы данных MySQL, и я наткнулся на предложение между, которое ранее было недоступно в ZF1.

Однако мой код, который выглядит примерно так, работает неправильно:

   $dateStart = '2012-12-20';
   $dateEnd = '2012-12-31';

   $sql = new Sql($_db);
   $select = $sql->select()
                ->from(array("t" => $table))
                ->columns(array("col1" => "col_as_1", "col2" => "col_as_2"));

 $select->where->between("date", $dateStart, $dateEnd);
 $stmt = $sql->prepareStatementForSqlObject($select);
 $result = $stmt->execute()->getResource()->fetchAll(\PDO::FETCH_ASSOC);

По-видимому, предложение between не является инклюзивным, я могу получить результаты только до 2012-12-30, есть ли способ сделать его инклюзивным? Я просматривал документы ZF2, но они не очень полезны, и выполнение того же запроса в браузере запросов MySQL возвращает все нужные мне данные.


person Osvaldo Mercado    schedule 08.01.2013    source источник


Ответы (5)


$from_date = date('Y-m-d', strtotime($AppCleaner->from_date ));
$to_date = date('Y-m-d', strtotime($AppCleaner->to_date ));

  $select->where->between('appointment_date', $from_date . ' 00:00:00', $to_date . ' 23:59:59');

также используйте предложение between, как показано ниже:

        $sql = new Sql($this->adapter);
        $select = $sql->select();
        $select->from('app_posts');
        $select->where->NEST->between( 'id', 30,40);
        $select->group('app_posts.id');
 //     echo $select->getSqlString($this->adapter->getPlatform());
//      exit;
        $statement = $sql->prepareStatementForSqlObject($select);
        $result = $statement->execute();
        $resultSet = new ResultSet();
        $resultSet->initialize($result);
        $posts = $resultSet->buffer()->toArray();
        return $resultSet;
person vidur punj    schedule 10.04.2018

Итак, вы можете попробовать lessThanOrEqualTo и greaterThanOrEqualTo.

Между, похоже, не предоставляет эту функциональность: between($identifier, $minValue, $maxValue)

Если вы проследите свой запрос с помощью $select->__toString(), вы увидите запрос в виде строки.

У меня на компьютере нет ZF2, но я мог представить, что between в ZF2 выведет date > '2012-12-20' AND date < '2012-12-31'.

person bitWorking    schedule 08.01.2013
comment
Концептуально это правильный ответ (хотя, может быть, слишком краткий?). @redreggae - Не могли бы вы подробнее рассказать о том, как это поможет решить проблему. - person Leigh; 08.01.2013

ВНИМАНИЕ: ПРИ ИСПОЛЬЗОВАНИИ between в Mysql

date_column_name between 'startDate' AND 'endDate'

ПРИМЕЧАНИЕ. вы должны вставить +1 дату в endDate. Из-за того, что при вставке даты 2015-05-18 в endDate вы не можете получить данные за 2015-05-18. Поэтому вам нужно добавить одну дату к >конечная дата.

Вы можете сделать это, используя это

$plusToDate = date('Y-m-d H:i:s', strtotime($toDate . ' + 1 day'));
person UWU_SANDUN    schedule 18.05.2015

МЕЖДУ должно быть включено, уверены ли вы, что после даты нет часов, минут и секунд, из-за которых он не будет выбирать даты 2012-12-31, поскольку 2012-12-31 00:00:01 технически будет > 2012-12-31

person Juni Samos De Espinosa    schedule 09.01.2013

Формат должен быть таким же, используйте функцию mysql DATE

$select->where->between("DATE(date)", DATE('.$dateStart.'), DATE('.$dateEnd.'));

person Vipul    schedule 17.12.2014