【问题标题】:Cannot get records with datetime less than system date无法获取日期时间小于系统日期的记录
【发布时间】:2019-06-05 17:55:45
【问题描述】:

我正在尝试检查记录列表的datetime 是否小于系统datetime,这些记录的字段status 也必须等于12。我所做的如下:

SELECT SUM(m2.datetime < NOW() AND m2.status IN (1, 2)) < 0 AS result 
FROM `match` m2 WHERE m2.round_id = @round_id GROUP BY m2.round_id

此查询在以下情况下不起作用:

id | datetime              | status |
 1    2018-11-30 18:00:00      5
 2    2018-12-09 13:30:00      5
 3    2018-12-15 14:00:00      5
 4    2018-12-21 13:30:00      5
 5    2019-01-08 17:45:00      1

正如您在上面显示的记录列表中看到的,我有 4 条状态为 5 的记录,所有这些记录的日期都小于当前系统 datetime。现在,我有另一条状态等于1 的记录的日期时间小于当前,所以查询的结果应该是true,因为有一条记录的status 等于@ 987654333@ 并且还有一个datetime 小于系统datetime。为什么查询返回 false?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    如果您想要计数,请删除 &lt; 0

    SELECT round_id, SUM(m2.datetime < NOW() AND m2.status IN (1, 2))AS result 
    FROM `match` m2
    WHERE m2.round_id = @round_id
    GROUP BY m2.round_id
    

    或者更好的是,将条件移至where 子句:

    SELECT COUNT(*) AS result 
    FROM `match` m2
    WHERE m2.round_id = @round_id AND
          m2.datetime < NOW() AND m2.status IN (1, 2)
    

    【讨论】:

      【解决方案2】:

      比较永远不会返回小于 0 的结果,如果我理解正确,您希望返回 true,因此不需要比较,而且我认为不需要 SUM,所以我将查询更改为

      SELECT (m2.datetime < NOW() AND m2.status IN (1, 2)) AS result 
      FROM `match` m2 WHERE m2.round_id = @round_id 
      

      【讨论】:

      • 您的查询返回一个 0 列表
      • @zparo 在对您的示例数据运行查询时,最后一行得到 1,其他行得到 0,但我跳过了 WHERE 子句,因为我不明白 round_id 是什么。跨度>
      猜你喜欢
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 2014-12-30
      • 2013-10-03
      • 2021-11-19
      • 1970-01-01
      • 2015-10-14
      • 2013-08-03
      相关资源
      最近更新 更多