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

Sql 在Oracle中,查找下一个特定日期,sql,oracle,date,oracle11g,Sql,Oracle,Date,Oracle11g,我正在编写一个程序,我需要将日期与未来的特定日期进行比较。我想默认为2月的最后一天。因此,如果我在1月或2月运行报告,如果是同一年的闰年,那么日期将是2月28日或29日。如果我在3月或更晚的时候运行报告,日期将是次年的2月28日或29日 除了解析月份和年份,然后通过将月份和日期设置为3月1日减去1天来创建日期,如果月份>=3,则将年份设置为年+1,还有更简单的方法吗 如果月份是2月或1月,则获取当前年份,并将日期设置为3月1日减去1日。否则,“获取当前年份”将向该年添加一,然后将日期设置为3月1

我正在编写一个程序,我需要将日期与未来的特定日期进行比较。我想默认为2月的最后一天。因此,如果我在1月或2月运行报告,如果是同一年的闰年,那么日期将是2月28日或29日。如果我在3月或更晚的时候运行报告,日期将是次年的2月28日或29日


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

如果月份是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;

如果月份是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;
您可以使用last_day获取月的最后一天,并使用add_months向日期添加月数。也许有一种巧妙的数学方法可以避免我没有想到的案例陈述

-- 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
您可以使用last_day获取月的最后一天,并使用add_months向日期添加月数。也许有一种巧妙的数学方法可以避免我没有想到的案例陈述

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

实际上,您使用的是3月1日作为一年的开始,因此您可以使用add_months功能将日期向前调整10个月,找到实际日历年的开始,然后找到调整后的一年中的3月1日,以及之前的一天:

add_months(trunc(add_months(sysdate, 10), 'YYYY'), 2) - 1

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

您基本上使用3月1日作为一年的开始,因此您可以使用“添加月份”功能将日期向前调整10个月,找到实际日历年的开始日期,然后找到调整后年份的3月1日,再找到调整后年份的前一天:

add_months(trunc(add_months(sysdate, 10), 'YYYY'), 2) - 1

使用CTE生成大范围的日期,以便您可以查看这些日期以及每个日期的计算日期。

如果您是在2月29日跑步?@wero您说得对-我想要2月的最后一天,并且只在将来。如果我在闰年的2月28日或29日运行它,我想要当前日期。我会更新这个问题。如果你在2月29日跑步?@wero你说得对-我想要2月的最后一天,而且只在将来。如果我在闰年的2月28日或29日运行它,我想要当前日期。我会更新问题,这很好。我只是在Crystal Reports中做了同样的事情:不同的语法,相同的逻辑。这很好。我只是在Crystal Reports中做了同样的事情:不同的语法,相同的逻辑。