查询返回 WHERE 条件范围之外的数据

Query returning data outside the scope of the WHERE condition

我正在尝试根据日期时间和状态从 table 中检索汇总数据。 问题是我需要多个状态值 ex。 'where 1 or 2 or 3'

SELECT SUM(ticketTotalAmount)
FROM tickets 
WHERE ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59'
  AND ticketState = 'STAND BY'
   OR ticketState = 'WIN'
   OR ticketState = 'LOSE'

输出应根据这 3 种状态(获胜、失败或待机)中的任何一种检索汇总数据,并且在 ticketDate 的范围内,但实际输出超出了 DateTime 限制的范围。

去除状态条件,只保留日期时间检索条件范围内的数据。问题是不止这3个状态。

将工单状态条件括在圆括号内

SELECT SUM(ticketTotalAmount) FROM tickets 
WHERE ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59' AND ( ticketState = 'STAND BY' OR ticketState = 'WIN' OR ticketState = 'LOSE')

使用IN

SELECT SUM(ticketTotalAmount) FROM tickets 
WHERE ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59' 
AND ticketState in( 'STAND BY' , 'WIN' ,'LOSE')

问题是 ANDOR 子句的顺序。

试试这个:

SELECT SUM(ticketTotalAmount)
FROM   tickets 
WHERE  ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59' AND
       (ticketState = 'STAND BY' OR ticketState = 'WIN' OR ticketState = 'LOSE');

甚至更好:

SELECT SUM(ticketTotalAmount)
FROM   tickets 
WHERE  ticketDate BETWEEN '2019/04/01 00:00:00' AND '2019/04/02 23:59:59'
  AND  ticketState IN ('STAND BY', 'WIN', 'LOSE');

我建议这样写查询:

SELECT SUM(t.ticketTotalAmount)
FROM tickets t
WHERE t.ticketDate >= '2019-04-01' AND
      t.ticketDate < '2019-04-03' AND
      t.ticketState IN ('STAND BY', 'WIN', 'LOSE');

注意查询的变化:

  • 而不是 OR,使用 IN。它更清楚。这解决了您的明确问题。
  • 日期逻辑得到简化,因此您不必处理时间值(或一天中最后几毫秒内出现的值)。
  • table 别名是个好主意;我通常认为它们在只有一个 table.
  • 的查询中是可选的

使用 IN([...]) 更易于阅读,但查看和理解括号对条件分组的用法很有用,这样您就可以获得所需的结果。示例:

SELECT SUM(ticketTotalAmount)
FROM tickets 
WHERE
        ticketDate >= '2019/04/01 00:00:00'
    AND ticketDate <= '2019/04/02 23:59:59'
    AND 
    (
           ticketState = 'STAND BY'
        OR ticketState = 'WIN'
        OR ticketState = 'LOSE'
    )