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

标签 sql database postgresql date postgresql-8.4

我可以从下面的查询中获取每年的 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

谁能帮帮我!

最佳答案

您的问题是缺少括号:在 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

关于sql - 尝试查找不同的数据时返回相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11963564/

相关文章:

sql - 需要高效的 SQL 将物化 View 中的行数与另一个物化 View 连接起来

c# - 将成员(member)服务应用到远程 sql 服务器

database - 从 sqlite 迁移到 postgresql

php - 如何发布到具有一对多关系的多个数据库表

windows - 为什么 Postgres 拒绝作为服务启动?

sql - 如何计算 apex 5 中单独记录的表中字符串的唯一出现次数

php - 如何在 php/html 中为每个评论设置单独的背景颜色?

django - 在 Django 中检索 OneToOne 相关的 QuerySet

postgresql - 在不支持 PostgreSQL 10 的 Ubuntu 16.04 上安装 phpPgAdmin 5.1

php - MySQL选择列直到数字