我从另一个选择中得到了period
,然后我必须在该日期前加上半个月,但它不起作用。它并没有给我一个错误,但是当我尝试根据newdate
和delai
(声明为FLOAT)更改日期时,并没有添加月份。
d_date = ADD_MONTHS( newdate , delai);
当period
= 0.5时,运行dbms_output.put_line(delai);
返回:,5
谢谢
答案 0 :(得分:4)
add_months()
的第二个参数为整数。它用于将整个月数添加到过去的日期。甚至有争议(考虑add_months(date '2019-02-28', 1)
与add_months(date '2020-02-28', 1)
的输出)。
如果我们将浮点数传递到add_months()
,则它仅舍入而不是抛出异常。 (也许还会引起争议。)因此,传递0.5
意味着它只会返回输入日期不变。
那么,“半个月”是什么意思?它不是标准的时间单位,因为它取决于我们讨论的月份。
如果您的意思是两周,请使用:
d_date := new_date + interval '14' day; -- interval doesn't support WEEK in Oracle
在数据库中,我们可以加一周(0.25),2周(0.5),一个月或一年(12),依此类推
您需要以编程方式处理它。声明一个变量以保持间隔
i interval day to second;
然后您的代码应如下所示:
if period < 1 then
if period = 0.25 then
i := interval '7' day;
elsif period = 0.5 then
i := interval '14' day;
elsif period = 0.75 then
i := interval '21' day;
end if;
d_date := new_date + i;
else
d_date := add_months(new_date, period);
end;
答案 1 :(得分:1)
如果您希望“半个月”表示该月天数的一半,则可以计算出:
declare
d_date date;
delai float := 0.5;
new_date date := date '2019-01-01';
begin
d_date := new_date + floor(delai * extract(day from last_day(new_date)));
dbms_output.put_line(d_date);
end;
/
2019-01-16
PL/SQL procedure successfully completed.
将new_date
设置为2019-02-01,它将给出2019-02-15。
您可能会猜到,last_day()
函数可为您提供该月最后一天的日期;然后extract(day from ...)
会为您提供天数,即28、29、30或31。然后将其乘以一半,然后floor()
停止添加任何小数天(这会影响时间部分)。
根据您的实际需求,您可能需要减去一天,或者使用ceil()
代替floor()
或其他方法,但是我认为这与您的描述很接近。
无论delai
是0.5还是0.25,都可以使用相同的方法;但是对于整数值,则可能需要切换回add_months()
。如果非整数值(1.25?)出现,那将是令人头痛的事情。