根据每月的某一天返回日期范围

时间:2017-06-05 18:57:32

标签: sql oracle

Select * 
From Orders

WHERE   (
        extract(day from sysdate)<=21          
        and 
        to_date(SCHEDULEDATE , 'yyyy/mm/dd') between 
        to_date((to_char(sysdate, 'YYYY')||'/'||cast((extract(month from sysdate)-1)as char)||'/22'),'yyyy/mm/dd') and to_date((to_char(sysdate,'YYYY')||'/'||cast((extract(month from sysdate))as char)||'/21'),'yyyy/mm/dd')
       )
      or
      (

       extract(day from sysdate)>21 
       and 
       to_date(SCHEDULEDATE , 'yyyy/mm/dd') between 
       to_date((to_char(sysdate, 'YYYY')||'/'||cast((extract(month from sysdate))as char)||'/22'),'yyyy/mm/dd') and to_date((to_char(sysdate, 'YYYY')||'/'||cast((extract(month from sysdate)+1)as char)||'/21'),'yyyy/mm/dd')
    )

我试图找出一种基于月份日期返回一组日期范围的简单方法。如果小于或等于我的日期希望它返回所有订单,则具有在当月的22个月和当前月的第21个之间的计划日期。如果当月的日期大于21,我希望它返回所有具有当月的计划日期直到月末的订单。我试图在没有运气的情况下使用案例。我现在所做的事情似乎也无效。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为这可以满足您的需求:

WHERE (extract(day from sysdate) <= 21 and  
       scheduledate >= add_months(trunc(sysdate, 'MON'), -1) + 21 and  
       scheduledate < trunc(sysdate, 'MON') + 21
      ) or
      (extract(day from sysdate) > 21 and
       trunc(scheduledate, 'MON') = trunc(sysdate, 'MON')
      )