gpt4 book ai didi

oracle - plsql - oracle add_months 添加额外的日期

转载 作者:行者123 更新时间:2023-12-02 20:49:29 26 4
gpt4 key购买 nike

甲骨文:12c

描述:尝试使用 add_months 将 99 年添加到日期中,该方法可以工作,但它会在返回日期值中添加额外的一天。我应该如何正确地为日期添加年份?

declare 
toRetDate DATE;
inputDate DATE;
numYears number;
begin

numYears := 99;
inputDate := TO_DATE('28-FEB-85', 'DD-Mon-YY' );
toRetDate := add_months(inputDate, numYears*12);
DBMS_OUTPUT.put_line(toRetDate);
end;

输出:29-FEB-84

最佳答案

ADD_MONTHS 不会在结果中添加一天。相反,它有一个非常普遍的功能:如果您将 MONTHS 添加到某个日期,并且该日期是该特定月份/年份的月底,则 ADD_MONTHS 的结果是结果月份的最后一天。

例如,如果您在 1 月 31 日基础上添加一个月,则始终会得到 2 月 28 日(闰年则为 2 月 29 日)。如果将 6 月 30 日加一个月,则得到 7 月 31 日。

如果你在 2 月 28 日加上一个月,你就会得到 3 月 31 日,除非它是闰年;在闰年中,2 月 28 日不是该月的最后一天,因此如果添加一个月,就会得到 3 月 28 日。

在所有情况下,如果结果的天数大于结果月份的天数,则结果只是该月的最后一天。

编辑:在这个答案下面的评论中,OP询问是否有办法保持该月的同一天,除了2月29日(应该变成2月29日)。非闰年为 28)。

答案是肯定的。正如 @Xing 在另一个答案中所示,添加 interval '99'year 将保留日期,但当输入日期为 2 月 29 日且结果年份不是闰年时,可能会导致问题。这可以通过初步检查来解决。可以使用 IF 语句或 CASE 表达式来完成。我更喜欢后者,因为它在 PL/SQL 和 SQL 中的工作原理相同;普通 SQL 中没有 IF。

toretdate := case when to_char(inputdate, 'mm-dd') = '02-29'
then (inputdate + 1) + interval '99' year - 1
else inputdate + interval '99' year end

诀窍是,当inputdate是2月29日时,将其向前推进一天,使其成为3月1日,然后添加99年(仍然是3月1日),然后减去一天,使其成为3月1日2 月 29 日(如果是闰年)或 2 月 28 日(否则)。

关于oracle - plsql - oracle add_months 添加额外的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42818708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com