[英]BETWEEN and standard comparison operators Oracle SQL
由于我需要数据范围,因此我正在使用BETWEEN
,因为据我所知,以下两个查询应该相同:
select * from table1 where my_date1 - my_date2 between (-1) and (-30);
和
select * from table1 where my_date1 - my_date2 <= (-1) and my_date1 - my_date2 >= (-30);
但是,当我在脚本中尝试时:
SELECT
a.account_no AS ACCOUNT_NO,
a.installment_no AS INSTALLMENT_NO,
a.INSTALLMENT_DATE AS INSTALLMENT_DATE
FROM myTable a
INNER JOIN (SELECT
ACCOUNT_NO,
MIN(INSTALLMENT_NO) AS INSTALLMENT_NO
FROM myTable
WHERE
ACCOUNT_NO IS NOT NULL
AND INSTALLMENT_NO IS NOT NULL
AND STATUS = 'A'
GROUP BY ACCOUNT_NO) b
ON A.ACCOUNT_NO = B.ACCOUNT_NO AND A.INSTALLMENT_NO = B.INSTALLMENT_NO
WHERE (TRUNC(INSTALLMENT_DATE) - TRUNC(TO_DATE('12/01/2011','DD/MM/YYYY'))) BETWEEN (-1) AND (-30) -- If I change this
我有0行,但是当我改变时
WHERE (TRUNC(INSTALLMENT_DATE) - TRUNC(TO_DATE('12/01/2011','DD/MM/YYYY'))) BETWEEN (-1) AND (-30)
至
WHERE (TRUNC(INSTALLMENT_DATE) - TRUNC(TO_DATE('12/01/2011','DD/MM/YYYY'))) <= (-1) and (TRUNC(INSTALLMENT_DATE) - TRUNC(TO_DATE('12/01/2011','DD/MM/YYYY'))) >= (-30)
我得到超过0行。 我想使用BETWEEN
因为它更具可读性。 我想念什么吗?
我相信BETWEEN
使用的范围的语法是:
WHERE col BETWEEN <smaller_value> AND <larger_value>
相当于
WHERE col >= <smaller_value> AND col <= <larger_value>
您当前的WHERE
子句正在寻找日期差大于 -1
且小于 -30
。 这将消除您尝试定位的所有记录,并且实际上永远不会是真实的。 要解决此问题,请更正范围:
WHERE (TRUNC(INSTALLMENT_DATE) - TRUNC(TO_DATE('12/01/2011','DD/MM/YYYY')))
BETWEEN (-30) AND (-1)
https://docs.oracle.com/cd/B28359_01/server.111/b28286/conditions011.htm#SQLRF52147说:
expr1 [否]在expr2和expr3之间
如果expr3 <expr2,则间隔为空。
BETWEEN是一种语法快捷方式,其评估为
WHERE col >= [smaller_value] AND <= [larger_value]
并且比较的值以该顺序(从小到大)显示是至关重要的,否则将永远无法满足。
但是,我绝不建议在日期范围之间使用,而建议始终使用以下语法:
WHERE col >= [smaller_value] AND < [larger_value]+1
此语法允许对任何时间精度级别的日期/时间信息进行精确过滤。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.