sql - 查找给定日期学期的最后一天
问题描述
我想实现一个以日期为参数并返回参数日期学期的最后一天的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
还是,在结果中添加 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;
/
推荐阅读
- javascript - 拆分时将分隔符放入Array
- c++ - 需要帮助创建一个休眠条件的循环,当满足条件时它会停止,直到下一个动作
- ios - 如何在 UICollectionViewDataSource 和 UICollectionViewDelegateFlowLayout 方法中调用正确的数据源?
- rest - REST API 的迭代器:skip and take
- javascript - 当我自动单击主下拉框时,下拉依赖框不起作用
- r - 使用 mutate_at 时在函数中使用变量名
- php - 这些函数是否检查是否有与数据库的连接并显示数据?
- c# - 客户端未使用 SignalR 接收集线器推送
- python - 在 PyQt 中使用属性列表
- javascript - JavaScript 当地时间打印