1

每当我OR在 where 条件下使用时,我的查询都在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它时,它会显示预期的日期数据,但我想ORwhere子句中使用。

4

2 回答 2

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
于 2018-08-02T06:37:31.130 回答
1

与@Mureinik 的答案相同,除了我认为您不需要那些调用 to 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-022018-08-032018-08-02follow_updatetime

于 2018-08-02T06:41:59.890 回答