При попытке посчитать количество оставшихся дней, в DBMS_OUTPUT дни отображаются с минусом

Друзья.

У меня такая задача: Получить по ID клиента информацию о его открытом вкладе. Необходимо отобразить номер договора вклада, и дату с которой он действует. А также сколько дней осталось до его закрытия, относительно текущей дате, в случае если договор открыт. Если вклад клиента уже закрыт, то отобразить соответствующее сообщение.

Незнаю почему, но в Output-е у меня отображается количество дней с минусом.

Должно быть так: 65

А сейчас отображается так: -65

Таблица вкладов (Deposits): Смотрим только тот вклад который с ClientID - 103. Отредактировал дату начала действия, чтобы удобно было работать с текущим днем/месяцем. Т.к. другие уже теоритически закрыты (открыты год назад)

Вот что я успел написать, надеюсь на вашу помощь.

Используемая версия Oracle: Oracle Database 12c Standard Edition Release 12.2.0.1.0

DECLARE
vClientID         NUMBER;
vDepStartDate     DATE;
vDepEndDate       NUMBER;
vDepDays          NUMBER;
vDogNum           VARCHAR2(10);
vCountMoreOneDep  NUMBER;
vDateClose        DATE;
BEGIN
  vClientID := 103;
  
SELECT DOG_NUM, DOG_DATE
  INTO vDogNum, vDepStartDate
  FROM Deposits
 WHERE ClientID = vClientID;
   DBMS_OUTPUT.PUT_LINE('Договор № ' || vDogNum || ', '|| 'действует с ' || to_char(vDepStartDate, 'dd.mm.yyyy'));


SELECT TRUNC(SYSDATE)-DOG_DATE-DEPOSITDAYS
  INTO vDepEndDate
  FROM DEPOSITS
 WHERE ClientID = vClientID;
 DBMS_OUTPUT.PUT_LINE('До закрытия вклада осталось: ' || vDepEndDate);

SELECT COUNT(DOG_NUM)
  INTO vCountMoreOneDep
  FROM DEPOSITS
 WHERE ClientID = vClientID
   AND DEPOSIT_STATUS = 1;

EXCEPTION
   WHEN TOO_MANY_ROWS THEN 
     DBMS_OUTPUT.PUT_LINE ('Извините, данный запрос не может быть обработан, т.к. у клиента несколько вкладов.');
     DBMS_OUTPUT.PUT_LINE ('Пожалуйста, обратитесь к менеджеру для уточнения информации.');
   WHEN NO_DATA_FOUND THEN
     DBMS_OUTPUT.PUT_LINE ('По клиенту: ' || (vClientID) || (' вклады не найдены.')); 
END;

Ответы (1 шт):

Автор решения: Ma Yan

Всем большое спасибо за участие в вопросе.

Надо было к дате договора, прибавить количество дней на который клиент открыл вклад и высчитать из него текущую дату (SYSDATE).

А у меня было так: Я высчитывал из SYSDATE, дату открытия и дату на который размещен вклад. В итоге я получал -65 дней, т.е. по факту у меня вклад закончился 65 дней назад. Мое суждение что нужно просто убрать минус, и оставить 65 дней было неверным.

Было так:

SELECT TRUNC(SYSDATE)-DOG_DATE-DEPOSITDAYS
  INTO vDepEndDate
  FROM DEPOSITS
 WHERE ClientID = vClientID;
 DBMS_OUTPUT.PUT_LINE('До закрытия вклада осталось: ' || vDepEndDate);

Нужно так:

SELECT DOG_DATE+DEPOSITDAYS-TRUNC(SYSDATE)
  INTO vDepEndDate
  FROM DEPOSITS
 WHERE ClientID = vClientID;
 DBMS_OUTPUT.PUT_LINE('До закрытия вклада осталось: ' || vDepEndDate);

→ Ссылка