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
колонка.