SQL, где условие даты

#php #mysql #sql #date

#php #mysql #sql #Дата

Вопрос:

Я хочу получить данные о продажах между двумя датами, но это неправильно работает SQL-запрос.

столбец saledate

   if($_GET['startdate'])
  {
    $startdate = date('Y-m-d H:i:s', strtotime($_GET['startdate']));
  }
  else
  {
    $startdate = 'NOW()';
  }
  if($_GET['enddate'])
  {
    $enddate = date('Y-m-d H:i:s', strtotime($_GET['enddate']));
  }
  else
  {
    $enddate = date('Y-m-d H:i:s', strtotime('-1 month'));
  }
  $db->setTrace('true');

  $sales = $db->rawQuery('SELECT * from sales where (saledate BETWEEN ? AND ?) AND deletestat = ?',  [$startdate, $enddate, '0']);
  print_r($db->trace);
  

Я использую класс joshcam / mySQLi для запросов sql.

Как получить данные между двумя датами?

Комментарии:

1. А) Какие результаты вы получаете? Б) В чем проблема? Вы не говорите, что означает «работать правильно» или даже что работает не так, как должно.

2. конкретно объясните, получаете ли вы ошибку или неправильный результат?

3. @Jagrati Я не получаю ошибку или неправильный результат. Результат запроса возвращает null.

4. @tadman А) Я хочу получить данные между двумя датами. Пример: 10.09.2016 между данными 10.10.2016. Б) Он не получает данные в пределах указанного диапазона дат. Хотя данные датированы 18.09.2016.

5. Вы уверены, что ваши даты правильно форматируются? Они должны быть в, YYYY-MM-DD HH:MM:SS что, надеюсь, и выдает ваш date код.

Ответ №1:

Функция mysql between работает иначе, чем вы ожидаете.

Функция between ожидает, что первый параметр будет минимальным значением, а второй параметр — максимальным значением. Смотрите документацию:http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_between

Если вы измените эту строку:

 $sales = $db->rawQuery('SELECT * from sales where (saledate BETWEEN ? AND ?) AND deletestat = ?',  [$startdate, $enddate, '0']);
  

К этому:

 $sales = $db->rawQuery('SELECT * from sales where (saledate BETWEEN ? AND ?) AND deletestat = ?',  [$enddate, $startdate, '0']);
  

Чем это будет работать.

Комментарии:

1. Это не сработало. Результат трассировки; SELECT identityno, name, salesprice, restprice, commission, comissier, profit, saledate, type from sales where (saledate BETWEEN '2016-09-10 00:00:00' AND '2016-08-10 00:00:00') AND deletestat = '0' но не получить данные между датой

2. Как вы можете видеть, минимальное и максимальное значения неверны. Вы должны переключить это. Я думаю, проблема в том, что у вас есть — 1 месяц, когда даты нет. Но когда вы добавляете дату, у вас может быть дата в будущем.

3. Есть данные на дату 18/09/2016, но не получены данные

4. можете ли вы попробовать этот sql через phpmyadmin или mysql cli и посмотреть, есть ли какой-либо вывод: SELECT identityno, name, salesprice, restprice, commission, comissier, profit, saledate, type from sales where (saledate BETWEEN '2016-08-10 00:00:00' AND '2016-09-19 00:00:00') AND deletestat = '0'