а также полностью неоплаченные счета, для которых платежей
вообще не существует, т.е., выполняется условие
NOT EXISTS
(SELECT bill_num FROM k_payment p
WHERE b.bill_num=p.bill_num)
Открываем курсор и читаем из него в цикле последовательно по
одной строке. Каждая строка содержит информацию об одном
просроченном неоплаченном счете.
Для текущего счета вычисляем количество дней, на который он
просрочен, с помощью функции DATEDIFF:
DATEDIFF(day, @dat, GETDATE())
Первый параметр этой функции означает единицу измерения (дни),
второй и третий – даты, для которых мы вычисляем разность (текущая
дата минус дата счета).
Далее для текущего счета вычисляем общую сумму оплаты.
Пени будут начисляться на неоплаченную часть суммы счета, по
заданному проценту за каждый день просрочки.
Напечатаем список счетов до выполнения процедуры:
SELECT bill_num, bill_term, bill_peni, bill_sum
FROM k_bill
bill_num bill_term bill_peni bill_sum
-------- --------------------------- --------- --------
1 2006-04-02 16:46:10.800 0 1000
2 2006-04-02 16:46:10.810 0 2000
3 2006-04-02 16:46:10.810 0 2000
4 2006-04-02 16:46:10.810 0 6000
5 2006-04-02 16:46:10.810 0 2000
6 2006-04-02 16:46:10.810 0 2500
7 2006-04-02 16:46:10.810 0 1500
8 2006-04-02 16:46:10.810 0 1200
9 2006-04-02 16:46:10.810 0 10000
(9 row(s) affected)
Пусть, например, сегодня 1 мая 2006 г. Запустим процедуру.
EXEC peni 0.5
Напечатаем список счетов после выполнения процедуры:
SELECT bill_num, bill_term, bill_peni, bill_sum
FROM k_bill
bill_num bill_term bill_peni bill_sum
-------------------------------------------------------
1 2006-04-02 16:46:10.800 0 1000
2 2006-04-02 16:46:10.810 145 2000
3 2006-04-02 16:46:10.810 0 2000