我正在编写程序,我需要将日期与未来的特定日期进行比较。我想默认到二月的最后一天。因此,如果我在1月或2月运行报告,则该日期将是同年的2月28日(如果是闰年则为29)。如果我在三月或之后运行报告,则日期将是次年的2月28日(或29日)。
除了解析月份和年份之外,还有更简单的方法,然后通过将月份和日期设置为3月1日减去1天来创建日期,如果月份是> = 3,则将年份设置为年份+ 1 ?
答案 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;