SQL - 选择当前月份在某个范围内的位置

时间:2015-10-29 15:10:03

标签: sql oracle

我正在尝试扩展我的(Oracle)SQL技能,我最近遇到了这种情况,我认为这将是一个很好的例子。我可以使用Python轻松处理这个问题,但我想尝试一下SQL。

我有一个应用程序,需要根据当前月份查询不同的产品。我在编写正确的sql以获取冬季产品时遇到问题,因为月份范围越过新的一年,而且大于等于的基本dg.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithAutoHeaderText; dg.SelectAll(); Clipboard.SetDataObject(dg.GetClipboardContent()); File.WriteAllText(@"path.txt", Clipboard.GetText(TextDataFormat.Text)); 语句将是不够的。

Product  Start_Month  End_Month  
------   -----------  ---------  
Shorts        5           9  
Jackets      10           4  

我一直在修补一些CASE WHEN陈述,但我没有任何值得展示的东西。下面的SQL在夏季工作正常,但冬天失败了。它显然需要一些条件语句,我没有找到任何好的高级SQL教程和示例。有关如何改进以下SQL以返回正确行的任何建议?

WHERE

2 个答案:

答案 0 :(得分:2)

您需要使用双重条件,因为范围不同

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)  )
)

enter image description here

答案 1 :(得分:0)

假设您的月份范围超过一年,您可以尝试以下代码:

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;

这有点乱,但它是Juan Carlos Oropeza的另一个解决方案。