尝试查找不同数据时返回相同的结果

Posted

技术标签:

【中文标题】尝试查找不同数据时返回相同的结果【英文标题】:Get back the same result when trying to find different data 【发布时间】:2012-08-15 02:59:10 【问题描述】:

我可以从下面的查询中获取每年的15/02 - 21/06 日期范围数据。

SELECT * FROM dim_date
WHERE EXTRACT (MONTH FROM date_cal) BETWEEN 3 AND 5
 OR (EXTRACT (MONTH FROM date_cal) = 2 AND EXTRACT (DAY FROM date_cal) >= 15)
 OR (EXTRACT (MONTH FROM date_cal) = 6 AND EXTRACT (DAY FROM date_cal) <= 21)

但问题是,当我想从年份2010 - 2012 中查找时,我得到了相同的结果。

我想得到的范围:

2010-02-15 - 2010-06-15
2011-02-15 - 2011-06-15
2012-02-15 - 2012-06-15

SELECT * FROM dim_date
WHERE EXTRACT (MONTH FROM date_cal) BETWEEN 3 AND 5
 OR (EXTRACT (MONTH FROM date_cal) = 2 AND EXTRACT (DAY FROM date_cal) >= 15)
 OR (EXTRACT (MONTH FROM date_cal) = 6 AND EXTRACT (DAY FROM date_cal) <= 21)
AND EXTRACT (YEAR FROM date_cal) BETWEEN 2010 AND 2012

谁能帮我解决这个问题!

【问题讨论】:

考虑follow-up question with more answers。还有this related question with much more on the topic. 【参考方案1】:

您的问题是缺少括号:在 SQL 中,AND 优先于 OR,因此您需要将括号括在前面的整个表达式中:

SELECT * FROM dim_date
WHERE ( -- added bracket
 EXTRACT (MONTH FROM date_cal) BETWEEN 3 AND 5
 OR (EXTRACT (MONTH FROM date_cal) = 2 AND EXTRACT (DAY FROM date_cal) >= 15)
 OR (EXTRACT (MONTH FROM date_cal) = 6 AND EXTRACT (DAY FROM date_cal) <= 21)
 ) -- added bracket
AND EXTRACT (YEAR FROM date_cal) BETWEEN 2010 AND 2012

没有括号,你得到A or B or (C and D),但你想要(A or B or C) and D

【讨论】:

以上是关于尝试查找不同数据时返回相同的结果的主要内容,如果未能解决你的问题,请参考以下文章

两个不同的查询返回相同的对象 Spring Boot JPA

SQL返回一个字段包含相同数据但其他字段包含不同数据的行

EXCEL VLOOKUP函数怎么返回多列结果

Passport-jwt 不同的令牌相同的结果

查询每次运行都返回相同的数据

CoreML 使用 AVCaptureSession 返回不同的值