mysql:日期格式不适用于 OR 在 where 条件下

mysql : date format not working with OR in where condition

每当我在 where 条件下使用 OR 时,我的查询将 date_format() 设置为 date_format(),但当我使用 AND 时,它工作正常。

真实查询:

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 时,它显示的是预期日期数据,但我想在 where 子句中使用 OR

and 逻辑运算符的优先级高于 or 运算符(即,and 表达式先于 or 表达式求值,与您类似d 在算术表达式中计算加法之前先计算乘法)。为了实现您想要的行为,您需要用括号将 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 列上使用索引。