mysql:日期格式在条件下不能与OR一起使用

时间:2018-08-02 06:33:22

标签: mysql sql select logical-or logical-and

每当我在有条件的情况下使用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

2 个答案:

答案 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列上使用索引。