每当我在有条件的情况下使用OR
时,我的查询就将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
时,它显示了预期的日期数据,但是我想在OR
子句中使用where
。
答案 0 :(得分: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
答案 1 :(得分:1)
答案与@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
列上使用索引。