【问题标题】:mysql : date format not working with OR in where conditionmysql:日期格式不适用于 OR 在 where 条件下
【发布时间】:2019-01-09 19:55:15
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    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
    

    【讨论】:

    • 我建议您将ANDOR 的优先级与常规数学运算符*/+- 进行比较。我知道逻辑运算符的优先级,但我不知道什么是更高的优先级
    • @Cid “更高优先级”的意思是“首先被评估”——这是数学和计算机科学中的标准术语,尽管我喜欢这个类比。我已经编辑了我的答案以使用它,希望现在更清楚了。
    【解决方案2】:

    与@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午夜 或之后或严格地在@ 的午夜之前 时,任何日期都会匹配987654325@。这将涵盖2018-08-02 的一整天。这样做的版本比您拥有的更可取,因为它可以在 follow_updatetime 列上使用索引。

    【讨论】:

    • 如果follow_updatetimeDateTime 类型怎么办?如果我没记错的话,它将比较 '2018-08-02 08:42:42''2018-08-02' 和结果 false
    • @Cid 不。将时间戳与日期文字进行比较,您将在该日期与午夜的时间戳进行比较。如果您不相信我,请尝试查询 :-)
    • MySQL 会执行隐式转换吗?
    • 哦...这就是您要问的问题。是的,MySQL 应该进行隐式转换。
    • 抱歉,它不起作用,因为我的列类型是 DateTime
    猜你喜欢
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多