Добавление полмесяца в оракул пл / sql - PullRequest
0 голосов
/ 26 февраля 2019

Я получаю period от другого выбора, затем я должен добавить полмесяца к этой дате, но он не работает.Это не дает мне ошибку, но месяц не добавляется, когда я пытаюсь изменить дату на основе newdate и delai (которая объявлена ​​как FLOAT)

d_date = ADD_MONTHS( newdate ,  delai);

Когда period = 0,5работает dbms_output.put_line(delai); возвращает: ,5

спасибо

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Если вы хотите, чтобы «полмесяца» означало половину количества дней в этом месяце, вы можете рассчитать, что:

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?) Будут головной болью даже тогда, если они могут произойти ...

0 голосов
/ 26 февраля 2019

add_months() принимает целое число для второго аргумента.Это для добавления целых месяцев к прошедшей дате.Даже то, что является спорным (рассмотреть результаты add_months(date '2019-02-28', 1) против add_months(date '2020-02-28', 1)).

1005 * Если мы переходим поплавок к add_months() он просто округляет, а не бросать исключение.(Кроме того, спорный, возможно.) Таким образом, проходя 0.5 означает, что он просто возвращает дату ввода без изменений. 1009 * Итак, что вы имеете в виду под «полмесяца»?Это не стандартная единица времени, поскольку это зависит от того, какой месяц мы обсуждаем.

Если вы имеете в виду две недели, используйте это:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...