首页 > 解决方案 > 查找给定日期学期的最后一天

问题描述

我想实现一个以日期为参数并返回参数日期学期的最后一天的plsql函数。

function find_lastday_of_semetre(p_datdeb IN date := current_date)
      return date IS
  begin
      declare
          semestreLastDay date;
      begin

            -- semestreLastDay = the last day of the semestre of the p_datdeb
          return semestreLastDay ;
      end;
  end find_lastday_of_semetre;

例如 :

我知道如何根据日期参数获取月份、季度和年份的最后一天,但我不知道如何获取学期的最后一天。

获取季度的最后一天

semestreLastDay := TRUNC(ADD_MONTHS(p_datdeb, 3), 'Q') - 1

获取当月的最后一天

semestreLastDay := LAST_DAY(p_datdeb)

获取一年中的最后一天

semestreLastDay := ADD_MONTHS(TRUNC(p_datdeb, 'YEAR'), 12) - 1

谢谢

标签: sqloracleplsql

解决方案


我不明白您为什么将函数的代码放在嵌套块中。我认为这是没有原因的(只是缺乏知识)。

您也不需要局部变量 - 您可以将计算直接放在return语句中,如下所示。

我使用TRUNC(date_variable, 'YEAR')截断到年初,然后减去一天,然后ADD_MONTHS根据输入日期的月份部分是<= 6还是,在结果中添加 6 个月或 12 个月> 6

我还更正了拼写 - 您的代码中有“semetre”(缺少“s”)。特别糟糕,因为“seme s tre”是您任务中的主要概念。

所以 - 这是编写函数的极简方式:

create or replace function 
    find_lastday_of_semestre(p_datdeb IN date := current_date)
    return date
as
begin
    return add_months(trunc(p_datdeb, 'year') - 1, 
               case when extract(month from p_datdeb) <= 6 then 6 else 12 end);
end find_lastday_of_semestre;
/

推荐阅读