mysql: формат даты не работает с ИЛИ, где условие

Всякий раз, когда я использую OR где условие мой запрос ставит date_format() это работает, но когда я использую AND работает нормально

True Query:

SELECT * FROM `tbl_inquiry_trans`
WHERE date_format(follow_updatetime,'%Y-%m-%d') >= '2018-08-02'
    AND date_format(follow_updatetime,'%Y-%m-%d') <= '2018-08-02'
    AND emp_id=2 or user_id=2

Приведенный выше запрос должен отображать данные конкретной даты, но он показывает все данные дат.

Тестовый запрос:

SELECT * FROM `tbl_inquiry_trans`
WHERE date_format(follow_updatetime,'%Y-%m-%d') >= '2018-08-02'
    AND date_format(follow_updatetime,'%Y-%m-%d') <= '2018-08-02'
    AND emp_id=2

Когда я использую AND он показывает данные ожидаемой даты, но я хочу использовать OR в where пункт.

2 ответа

Решение

and логический оператор имеет более высокий приоритет, чем or оператор (т.е. and выражения оцениваются раньше or выражений, аналогичным образом вы бы вычислили умножение перед вычислением сложения в арифметическом выражении). Чтобы добиться желаемого поведения, вам необходимо окружить две стороны or оператор с круглыми скобками:

SELECT * 
FROM   tbl_inquiry_trans 
WHERE  date_format(follow_updatetime,'%Y-%m-%d')>='2018-08-02' AND 
       date_format(follow_updatetime,'%Y-%m-%d')<='2018-08-02' AND 
       (emp_id=2 OR user_id=2) -- Here

Тот же ответ, что и @Mureinik, за исключением того, что я не думаю, что вам нужны эти звонки DATE_FORMATпотому что в MySQL можно напрямую сравнивать даты со строковыми литералами. Итак, должно хватить следующего:

SELECT *
FROM tbl_inquiry_trans
WHERE
    follow_updatetime >= '2018-08-02' AND follow_updatetime < '2018-08-03' AND
    (emp_id = 2 OR user_id = 2);

Логика в вышеупомянутой проверке на follow_updatetime является то, что любая дата будет соответствовать, если бы это было на или после полуночи 2018-08-02 или строго до полуночи 2018-08-03, Это будет охватывать весь день 2018-08-02, Эта версия выполнения предпочтительнее, чем у вас, потому что она позволяет использовать индекс на follow_updatetime колонка.

Другие вопросы по тегам