При попытке посчитать количество оставшихся дней, в DBMS_OUTPUT дни отображаются с минусом
Друзья.
У меня такая задача: Получить по ID клиента информацию о его открытом вкладе. Необходимо отобразить номер договора вклада, и дату с которой он действует. А также сколько дней осталось до его закрытия, относительно текущей дате, в случае если договор открыт. Если вклад клиента уже закрыт, то отобразить соответствующее сообщение.
Незнаю почему, но в Output-е у меня отображается количество дней с минусом.
Должно быть так: 65
А сейчас отображается так: -65
Вот что я успел написать, надеюсь на вашу помощь.
Используемая версия 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 шт):
Всем большое спасибо за участие в вопросе.
Надо было к дате договора, прибавить количество дней на который клиент открыл вклад и высчитать из него текущую дату (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);
