SQL-选择当前月份在某个范围内的位置
我正在尝试扩展我的Oracle SQL技能,最近我遇到了这种情况,我认为这将是一个值得学习的好例子。我可以用Python轻松地处理这个问题,但我想用SQL试试 我有一个应用程序,需要根据当月查询不同的产品。我在编写正确的sql以获取冬季产品时遇到了问题,因为月份范围跨越了新的一年,而带有大于和小于then的基本WHERE语句是不够的 Product Start_Month End_Month ------ ----------- --------- Shorts 5 9 Jackets 10 4 我一直在修改一些案例,但我没有任何值得展示的东西。下面的SQL在夏季运行良好,但在冬季运行失败。它显然需要一些条件语句,我还没有找到任何好的高级SQL教程和示例。关于如何改进以下SQL以返回正确的行,有什么建议吗SQL-选择当前月份在某个范围内的位置,sql,oracle,Sql,Oracle,我正在尝试扩展我的Oracle SQL技能,最近我遇到了这种情况,我认为这将是一个值得学习的好例子。我可以用Python轻松地处理这个问题,但我想用SQL试试 我有一个应用程序,需要根据当月查询不同的产品。我在编写正确的sql以获取冬季产品时遇到了问题,因为月份范围跨越了新的一年,而带有大于和小于then的基本WHERE语句是不够的 Product Start_Month End_Month ------ ----------- --------- Shorts
SELECT Product FROM SEASONAL_PRODUCTS
WHERE Start_Month <= extract(month from sysdate)
AND End_Month > extract(month from sysdate);
您需要使用双重条件,因为范围不同
WHERE
( Start_Month < End_Month
AND Start_Month <= extract(month from sysdate) AND End_Month >= extract(month from sysdate)
)
OR
( Start_Month > End_Month
AND (Start_Month <= extract(month from sysdate) OR End_Month >= extract(month from sysdate) )
)
假设您没有超过一年的月份范围,您可以尝试以下代码:
SELECT Product
FROM SEASONAL_PRODUCTS
WHERE sysdate BETWEEN to_date(start_month || '-' || extract(YEAR FROM sysdate), 'MM-YY')
AND
CASE
WHEN END_MONTH - START_MONTH <= 0
THEN to_date(end_month || '-' || (extract(YEAR FROM sysdate) + 1), 'MM-YY')
ELSE to_date(end_month || '-' || (extract(YEAR FROM sysdate)), 'MM-YY')
END;
这有点混乱,但这是胡安·卡洛斯·奥罗佩扎回答的另一个解决方案 在夹克衫的数据中,起始月大于结束月,因此,如果这是有效数据,则需要在查询中处理。我想我有。当Need>或>=在2月份仍然存在问题时,需要再次检查。但是我认为我们可以通过添加另一组where条件来测试它是在年初还是年底。我只是更新代码。。你们需要的第一个案例,开始,结束,第二个案例,或者每个案例。假设今天是2月14日,这个月是4号。那么对于短裤来说,开始5=4在或部分如此正确,我刚刚意识到一个错误,我的意思是4月14日->月=4请给我一点时间来理解你的答案。我认为如果你使用更好的缩进,开始月份>=结束月份会更容易阅读