2014-10-16 8 views
0

Как написать хранимую процедуру DB2 для вычисления логики DPM.Хранимая процедура DB2 Вычисляет дни в месяц динамически

Например, с 1 января 2014 года по 30 сентября 2014 года будет отображаться 9 записей (одна запись в месяц). Для каждой записи, ДПМ (дней в месяц) должен быть вычислен во время выполнения и динамически обновляются в формуле:

select (((dpm*24)/2400) * 123)/dpm 
from xxx-table 
where date between '2014-09-01' and '2014-01-01' 

Как обеспечить правильный ДПМ обновляется в указанной выше формуле

Ожидаемые результаты

Jan - (((31*24)/2400) * 123)/31 
Feb -(((28*24)/2400) * 123)/28 
March - (((31*24)/2400) * 123)/31 
April - (((30*24)/2400) * 123)/30 
May - (((31*24)/2400) * 123)/31 
June - (((30*24)/2400) * 123)/30 
July - (((31*24)/2400) * 123)/31 
August - (((31*24)/2400) * 123)/31 
September - (((30*24)/2400) * 123)/30 
+0

Похоже, ваша формула всегда дает 1,23 как результат, так что вы можете пропустить свой ДПМ в целом. – mustaccio

ответ

0

Как @mustaccio сказал, ваша формула всегда упрощает до 1.23, перемещая первый DPM умножение «из» первой фракции:

(расп * (24/2400) * 123)/расп

Затем пм отменим друг друга, оставив только

(24/2400) * 123

Который является постоянным 1,23


Однако, если вы действительно нужны дней в расчете месяц, вы можете использовать рекурсивный запрос, чтобы построить свой список месяцев, а затем использовать LAST_DAY в сочетании с DAY скалярные функции. Я предполагаю, что вы используете DB2 для Linux/Unix/Windows, и я думаю, что LAST_DAY был добавлен в 9,7

WITH DATES (DTE, LVL) AS (
    SELECT CAST(@beginDate AS DATE), 0 
    FROM SYSIBM.SYSDUMMY1 
     UNION ALL 
    SELECT DTE + 1 MONTHS, LVL +1 
    FROM SYSIBM.SYSDUMMY1, DATES 
    WHERE DTE + 1 MONTHS <= @endDate 
) 

SELECT DAY(LAST_DAY(DTE)) 
FROM DATES 
+0

На самом деле система выполнила бы его как целочисленную математику, поэтому она не будет отменена. И вам не нужно 'LAST_DAY (...)' - Начните с 1-го числа месяца, добавив один месяц, затем просто вычтите конец с начала (плюс один). –