在Oracle中,查找下一个特定日期

时间:2015-07-15 21:40:41

标签: sql oracle date oracle11g

我正在编写程序,我需要将日期与未来的特定日期进行比较。我想默认到二月的最后一天。因此,如果我在1月或2月运行报告,则该日期将是同年的2月28日(如果是闰年则为29)。如果我在三月或之后运行报告,则日期将是次年的2月28日(或29日)。

除了解析月份和年份之外,还有更简单的方法,然后通过将月份和日期设置为3月1日减去1天来创建日期,如果月份是> = 3,则将年份设置为年份+ 1 ?

3 个答案:

答案 0 :(得分:4)

您基本上使用3月1日作为年初,因此您可以使用add_months()功能将日期调整为10个月,找到该年(实际日历)年的开始,以及然后在调整后的那一年找到3月的第一天,找到前一天:

add_months(trunc(add_months(sysdate, 10), 'YYYY'), 2) - 1
带有CTE的

SQL Fiddle demo生成大范围的日期,以便您可以查看这些日期以及为每个日期计算的日期。

答案 1 :(得分:1)

您可以使用last_day来获取该月的最后一天,并使用add_months为该日期添加一些月份。可能有一种可爱的数学方法来避免case陈述以及我没有想到

-- Showing the results that you would get if you ran on various dates.
-- In reality, you'd get rid of the CTE and just use sysdate in the query
with x as (
    select date '2015-01-01' dt from dual union all
    select date '2015-04-01' from dual union all
    select date '2015-02-28' from dual
 )
 select dt, 
        last_day( 
           add_months(dt, 
                      (case when extract(month from dt) <= 2 
                            then 2-extract(month from dt)
                            else 14-extract(month from dt)
                         end)
                      )
                 )
   from x

答案 2 :(得分:0)

如果月份是2月或1月,那么它将获得当前年份并将当天设置为3月1日减去1.否则,当前年份将增加一年,然后将当天设置为3月1日减1。

select case when extract(month from current_date) in (1,2) then to_date(extract(year from current_date) ||  '03','YYYYMM')-1 else to_date(extract(year from current_date)+1 ||  '03','YYYYMM')-1 end
from dual;