2015-10-05 3 views
0

Итак, я пытаюсь выбрать строки между двумя датами.
В дБ даты также имеют время.
Для этого мне нужно использовать LIKE.
SQL: Как использовать «LIKE» с датой «между»?

SQL

$query = "SELECT * FROM table WHERE date >= LIKE :selectedDateFrom AND <= LIKE :selectedDateTo"; 

$query_params = array(':selectedDateFrom' => $selectedDateFrom.="%", ':selectedDateTo' => $selectedDateTo.="%"); 

Это один возвращает ошибку!
Как это должно выглядеть?

+2

Какие СУБД вы используете? (ANSI SQL имеет BETWEEN, чтобы найти значения между двумя датами.) – jarlh

+0

ìm using Mysql MariaDb –

+0

@jarlh Если я использую между ними, это работает. Но если я выберу 1-й из окт. Результат начнется со 2-го октября? –

ответ

1

В дб, сроки также время.
Для этого мне нужно использовать LIKE.

Нет, вы этого не сделаете.

Чтобы выбрать все даты/времени, когда компонент даты находится между (от) и (в), включительно, вы можете написать его как

SELECT * 
FROM table 
WHERE date >= :selectedDateFrom 
AND date < :selectedDateToPlusOne 

(Обратите внимание на < вместо <= и установите второй параметр до одного дня после в последний день, который вы хотите включить в свои результаты.) Это работает, даже если столбец включает время.

+0

Почему нет "="? Если я выбираю 1-й - 30-й, я получаю только 1-2-е место? –

+0

@Mjukis Да, поэтому вы устанавливаете параметр «to» на один день позже. Следовательно, «PlusOne» я добавил к его названию. :) Отредактировано, чтобы привлечь к этому больше внимания. – hvd

+0

Да, я это заметил. Я должен добавить за день до того, как я сделаю это! –

0

вы не можете использовать как с датами в SQL SO использовать это:

$query = "SELECT * FROM table WHERE date >= :selectedDateFrom AND date <= :selectedDateTo"; 
+0

какая именно ошибка ?? –

0

Вы разделили бы временную часть с даты и времени на DATE().

SELECT * 
FROM mytable 
WHERE date(mydate) >= :selectedDateFrom 
AND date(mydate) <= :selectedDateTo; 

Или с BETWEEN для лучшей читаемости:

SELECT * 
FROM mytable 
WHERE date(mydate) BETWEEN :selectedDateFrom AND :selectedDateTo; 
+0

Мне не нужно разделять мои переменные: «ГГГГ-ММ-ДД» Это db, который является datetime. Поэтому я добавил подстановочный знак на мои вары. "%". Что такое: «(mydate)»? –

+0

Стоит отметить: фильтрация на 'date (mydate)' означает, что даже если таблица имеет индекс в 'mydate', этот индекс не может быть использован. Я рекомендую искать в простом «mydate», как в своем ответе, но другим способом избежать проблемы может быть создание индекса в «date (mydate)», если MariaDB поддерживает это. (Я знаю, что некоторые реализации базы данных поддерживают его, я не знаю конкретно о MariaDB.) – hvd

+0

@Mjukis: Я назвал вашу таблицу mytable и дату mydate, потому что 'table' и' date' зарезервированы слова SQL. Вы сказали, что «даты также имеют время». Я предположил, что это колонка, о которой вы говорите. Однако, чтобы избавиться от временной части, используйте 'DATE()', чтобы вы могли сравнивать даты без временной части. –

Смежные вопросы