我一直在努力让它发挥作用,但事实并非如此。当我将adate
的日期范围作为2014-03-12时,它甚至会显示以前日期的数据。我在这里缺少什么?
SELECT tno, type, ccno, paidamt, aby, adate, atime
FROM payment
WHERE
adate<='2014-03-12'
AND adate<='2014-03-12'
AND aby='anuradha'
AND type='ADD' OR type='REM'
AND delstat='0'
答案 0 :(得分:2)
支架
SELECT tno, type, ccno, paidamt, aby, adate, atime
FROM payment
WHERE
adate<='2014-03-12'
AND adate<='2014-03-12'
AND aby='anuradha'
AND (type='ADD' OR type='REM' )
AND delstat='0'
同时adate指定两次。您应该删除第二个
SELECT tno, type, ccno, paidamt, aby, adate, atime
FROM payment
WHERE
adate>='2014-03-12'
AND adate<='2014-03-12'
AND aby='anuradha'
AND type='ADD' OR type='REM'
AND delstat='0'
答案 1 :(得分:2)
我认为您的问题与OR
有关。将其括在括号中:
SELECT tno, type, ccno, paidamt, aby, adate, atime
FROM payment
WHERE
adate<='2014-03-12'
AND adate<='2014-03-12'
AND aby='anuradha'
AND (type='ADD' OR type='REM' )
AND delstat='0'
答案 2 :(得分:2)
我想知道你是否有错字
adate<='2014-03-12'
AND adate<='2014-03-12'
对于2014年3月12日或之前的所有行,查询的日期范围部分要求两次。那可能不是你想要的。
你想要这个吗?
adate >= '2014-03-12'
AND adate < '2014-03-12' + INTERVAL 1 DAY
这一对特殊的不等式是在某一天获得行的最可靠方法。
您也可以替换
AND type='ADD' OR type='REM'
与
AND type IN ('ADD', 'REM')
因为它可能会有更好的表现,让你不要试图猜测AND
和OR
的相关性(我相信你猜错了)。
答案 3 :(得分:1)
当我给adate的日期范围作为2014-03-12时,它甚至会向我显示之前日期的数据......我在这里缺少什么?
adate
的输入错误。当你说范围时,你应该使用不同的值,但是你没有这样做而且你正在比较之前的日期。因此,以前的日期结果。
尝试这种方式:
set @startDate = '2014-03-01'; -- as an example
set @endDate = '2014-03-12';
SELECT tno, type, ccno, paidamt, aby, adate, atime
FROM payment
WHERE
adate between @startDate and @endDate
AND aby='anuradha'
AND type in ('ADD', 'REM')
AND delstat='0'
答案 4 :(得分:0)
adate<='2014-03-12' AND adate<='2014-03-12'
在这里似乎是一个非常无用的重复条件。
接下来,由于逻辑运算符的优先级,现在你的语句已经制定,它被评估为
( adate<='2014-03-12' AND adate<='2014-03-12' AND aby='anuradha' AND type='ADD')
OR
(type='REM' AND delstat='0')
这可能不是你想要的,并解释为什么早期的日期渗透(通过OR条件的右侧。
可以在此处找到SQL中运算符优先级的相当完整的概述:SQL 'AND' or 'OR' comes first?和此处:SQL Logic Operator Precedence: And and Or