【问题标题】:MySQL with Many IF condition parameters具有许多 IF 条件参数的 MySQL
【发布时间】:2021-07-06 23:44:40
【问题描述】:

我有以下查询,我确实了解正常的 IF 条件是如何工作的,但是下面的一个有点令人困惑,不知道它到底在做什么?

SELECT * FROM `client` 
WHERE IF( date_due < due_date_none, date_due, due_date_none) < date(now()) 
&& DATEDIFF(NOW(), IF( date_due < due_date_none, date_due, due_date_none)) < 500

谁能告诉我 IF 条件在这里做什么?或者有没有更好更易读的方式来编写这个查询?

【问题讨论】:

  • 对于IF(),如果第一个参数为真则返回第二个参数,否则返回第二个参数。所以IF( date_die &lt; due_date_none, date_due, due_date_none) 将与date_duedue_date_none 的值相同,具体取决于date_due 是否小于due_date_none
  • 建议使用日期算术:WHERE some_date &gt; CURDATE() - INTERVAL 500 DAY
  • @Jhecht 你想添加你的答案而不是评论

标签: mysql performance


【解决方案1】:

对于IF(),如果第一个参数为真则返回第二个参数,否则返回第三个参数。所以IF( date_due &lt; due_date_none, date_due, due_date_none) 将与date_duedue_date_none 的值相同,具体取决于date_due 是否小于due_date_none

【讨论】:

  • 那句话不应该是“如果第一个参数为真则返回第二个参数,否则返回第三个参数”,它返回第三个参数,如果第一个条件为假是不是吗?请澄清
  • 正确。我在移动设备上发表了原始评论(我已复制/粘贴),但没有注意到错误。
【解决方案2】:

为了使其更具可读性,请考虑将 IF() 替换为 LEAST(),因为 IF() 只返回最小/最旧的日期。

如果第二个参数大于第一个参数,DATEDIFF() 会给你一个负数,所以首先检查日期是否过去是没有意义的,如果稍后你将在 DATEDIFF( )。

在我看来,您想检查 date_due 和 due_date_none 中的最小值是否介于(但不包括)今天和 500 天前之间。我认为您甚至不需要 DATEDIFF() 。

另外,一点点格式也不会有什么坏处。

所以这是我的建议:

SELECT
    *
FROM
    `client` 
WHERE
    LEAST(date_due, due_date_none) BETWEEN SUBDATE(CURDATE(), 499) AND SUBDATE(CURDATE(), 1) 

编辑:

如果 date_due 或 due_date_none 是包含小时、分钟和秒的 DATETIME,则将 LEAST() 放在 DATE() 中以删除小时、分钟和秒:

DATE(LEAST(date_due, due_date_none)) BETWEEN SUBDATE(CURDATE(), 499) AND SUBDATE(CURDATE(), 1) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2014-08-19
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多