在Oracle PL / SQL中添加半个月

时间:2019-02-26 17:34:34

标签: sql oracle plsql

我从另一个选择中得到了period,然后我必须在该日期前加上半个月,但它不起作用。它并没有给我一个错误,但是当我尝试根据newdatedelai(声明为FLOAT)更改日期时,并没有添加月份。

d_date = ADD_MONTHS( newdate ,  delai);

period = 0.5时,运行dbms_output.put_line(delai);返回:,5

谢谢

2 个答案:

答案 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?)出现,那将是令人头痛的事情。