【问题标题】:How to use opposite of BETWEEN in a MySQL query? [duplicate]如何在 MySQL 查询中使用 BETWEEN 的对立面? [复制]
【发布时间】:2014-11-19 12:33:35
【问题描述】:

我有一个工作查询,它​​使用“BETWEEN”来查找日期范围内的结果,我需要的是相反的结果或不在给定的日期范围内。这是下面的查询。

SELECT loanac.id, loanac.name, loanac.lacc, loanac.phone, 
SUM(loantrans.in) as totalin, SUM(loantrans.out) as totalout 

FROM loanac, loantrans 
WHERE (loanac.lacc=loantrans.account) 
AND (`loantrans`.`date` BETWEEN CAST('$range' AS DATE) AND CAST('$date' AS DATE))

GROUP BY loanac.lacc
HAVING SUM(IFNULL(`loantrans`.`out`,0)) > SUM(IFNULL(`loantrans`.`in`,0))

谁能帮我找到相反的结果或不在具有相同条件的日期范围之间的结果?

详情截图在这里:https://www.dropbox.com/sh/lgmop3zxqaf9mjy/AAAWVWjZXd8da9KDDOqz2ANla?dl=0

【问题讨论】:

    标签: mysql sql date


    【解决方案1】:

    鉴于您的 $date 和 $range 只是“现在”和“6 天前”,有 NO 理由在 PHP 中生成日期。为什么不简单

    WHERE datefield BETWEEN (curdate() - INTERVAL 6 DAY) AND curdate()
    a.k.a.
    WHERE datefield BETWEEN '2014-09-19' AND '2014-09-25'
    a.k.a
    WHERE (datefield >= '2014-09-19') AND (datefield <= '2014-09-25')
    

    相反的 (NOT) 将是

    WHERE (datefield > curdate()) OR (datefield < (curdate() - INTERVAL 6 DAY))
    a.k.a
    WHERE (datefield > '2014-09-25') OR (datefield < '2014-09-19')
    

    【讨论】:

    【解决方案2】:

    我唯一能想到的是,不知何故,定义日期间隔的表达式正在返回一个时间部分(那些strtotime() 看起来像是罪魁祸首)。当日期包含时间部分时,This answer 处理两个选项(选项 2 是好的选项)。

    在您的具体情况下,我认为这是解决问题的最佳方法:

    SELECT loanac.id, loanac.name, loanac.lacc, loanac.phone
         , SUM(loantrans.in) as totalin, SUM(loantrans.out) as totalout 
    FROM loanac
         INNER JOIN loantrans on loanac.lacc = loantrans.account
    -- Instead of an implicit join in the WHERE clause, use an explicit INNER JOIN
    WHERE date(loantrans.date) < date('$range')  
      AND date(loantrans.date) > date('$date')
    GROUP BY loanac.lacc
    HAVING SUM(IFNULL(`loantrans`.`out`,0)) > SUM(IFNULL(`loantrans`.`in`,0))
    

    请注意,date() 函数“删除”了值的时间部分。


    还有一件事:您的代码可能容易受到 SQL 注入攻击。请take a look here 提供一个(幽默的)例子来说明它是什么,以及如何处理它的提示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      相关资源
      最近更新 更多