2015-10-21 2 views
0

Я пытаюсь найти лучший способ создать цикл для продвижения даты. Вот пример того, что мои данные выглядит следующим образом:Создание сроков расчета платежей на основе срока и интервала

data example; 
    format first_pmt_date mmddyys10.0; 
    format schedule $25.; 

    id=1; 
    first_pmt_date="28JAN2011"d; 
    schedule='Bi-Weekly'; 
    term=52; 
    output; 

    id=2; 
    first_pmt_date="15JAN2011"d; 
    schedule='Weekly'; 
    term=156; 
    output; 

    id=3; 
    first_pmt_date="23JAN2011"d; 
    schedule='Semi-Monthly'; 
    term=72; 
    output; 
run; 

Я хотел бы создать цикл для продвижения first_pmt_date на основе оплаты scheudule (два раза в неделю, два раза в месяц, раз в неделю). Например, в случае с id 2 выше у меня было бы 156 строк со всеми датами оплаты, которые еженедельно продвигались с 15.01.2011. Вот пример того, что я ищу:

id first_pmt_date schedule term scheduled_pmt_date 
2 01/15/2011  Weekly  156  1/15/2011 
2 01/15/2011  Weekly  156  1/22/2011 
2 01/15/2011  Weekly  156  1/29/2011 
2 01/15/2011  Weekly  156  2/5/2011 
2 01/15/2011  Weekly  156  2/12/2011 
2 01/15/2011  Weekly  156  2/19/2011 
+0

проверить функции функции sas – DCR

ответ

1

Единственная странная выдумка для этого решения - для меня раз в две недели мне приходилось включать функцию мод, чтобы варьироваться от 3 до 4 дней в течение недели, принимая последнюю дату платежа в качестве базы, на которой нужно увеличивать ,

Я зациклился от 0 до TERM-1, что означает, что вы получите правильное количество дат платежа, используя функцию SAS intnx, чтобы увеличить даты по переменной цикла i. Я использовал 's' для выравнивания, чтобы убедиться, что все платежи совпадают с первой переменной платежа.

data example; 
format first_pmt_date SCHEDULED_PMT_DATE mmddyys10.0; 
format schedule $25.; 
id=1; 
first_pmt_date="28JAN2011"d; 
SCHEDULED_PMT_DATE=FIRST_PMT_DATE-3; 
schedule='Bi-Weekly'; 
term=52; 

do i = 0 to term-1; 
    SCHEDULED_PMT_DATE=intnx('day',SCHEDULED_PMT_DATE,3+mod(i,2)); 
    output; 
end; 

id=2; 
first_pmt_date="15JAN2011"d; 
schedule='Weekly'; 
term=156; 

do i = 0 to term-1; 
    SCHEDULED_PMT_DATE=intnx('week',FIRST_PMT_DATE,i,'s'); 
    output; 
end; 

id=3; 
first_pmt_date="23JAN2011"d; 
schedule='Semi-Monthly'; 
term=72; 

do i = 0 to term-1; 
    SCHEDULED_PMT_DATE=intnx('semimonth',FIRST_PMT_DATE,i,'s'); 
    output; 
end; 
run; 
+0

Абсолютно красивый Амит. Огромное спасибо. – davids12

+0

Без проблем :) В любое время. –

0

Semi-месячный несколько неоднозначным, если вы не можете привести пример того, как именно вы хотите, чтобы один для себя, но в противном случае вам лучше иметь целое число счетчик циклов, который увеличивается на единицу и использует функцию intnx, чтобы увеличить начальную дату на столько интервалов.

Смежные вопросы