查找给定日期的学期最后一天



我想实现一个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;

例如:

  • 如果p_date为12/02/2021,则semestreLastDay = 30/06/2021
  • 如果p_date为01/06/2022则semestreLastDay = 30/06/2022
  • 如果p_date为20/08/2023,则semestreLastDay = 31/12/2023

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

获取季度的最后一天

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

获取该月的最后一天

semestreLastDay := LAST_DAY(p_datdeb)

获取一年中的最后一天

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

感谢

我不明白你为什么把函数的代码放在嵌套块中。我想那是没有原因的(只是缺乏知识)。

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

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

我还纠正了拼写-你有"semetre"(在代码中缺少" ")自从"semestre"是你任务中的主要概念。

所以-这里是一个极简的方式来写你的函数:

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

您可以提取月份并检查其是否大于6,并从部分返回日期:从输入日期返回year和06-30或12-31:

return to_date(CASE
WHEN extract(month from p_datdeb) <= 6 THEN to_char(p_datdeb, 'yyyy') || '-' || '06-30'
ELSE to_char(p_datdeb, 'yyyy') || '-' || '12-31'
END, 'yyyy-MM-dd')

最新更新