2017-04-07 1 views
1

2 개의 날짜, 시작 날짜 및 종료 날짜가 부여됩니다.SAS 시작 및 종료 날짜가 부여됨 처음 35 일 후에 각 30 일 기간의 날짜를 알아야합니다.

처음 35 일의 기간을 알고 싶습니다. 그 다음 30 일마다 그 기간을 알고 싶습니다.

나는 가지고있다;

start  end 
22-Jun-15 22-Oct-15 
9-Jan-15 15-May-15 

나는 원하는데;

start  end   tik1  tik2  tik3  tik4 
22-Jun-15 22-Oct-15 27-Jul-15 26-Aug-15 25-Sep-15 
9-Jan-15 15-May-15 13-Feb-15 15-Mar-15 14-Apr-15 14-May-15 

날짜 계산에는 문제가 없지만 실제 문제는 변수를 만들고 그 이름을 증가시키는 것입니다. 나는 그것의 맥락에서 설명하는 것이 더 쉬울 수도 있기 때문에 내 모든 문제를 포함하기로 결정했다.

+0

문제에 대한 현재의 접근 방법은 무엇입니까? –

+0

루프의 변수 이름을 증가시키는 컬럼의 값을 얻기위한 매크로를 가질 수 있습니다 .... 변수가있는 임시 테이블 생성 .... 이전 테이블과 병합 –

+0

넓은 출력을 원하십니까? 체재? 또는 길고 좁은 형식도 사용할 수 있습니다. 즉, 각 기간에 대해 하나의 레코드를 생성합니다. – Quentin

답변

2

당신은 다음과 같은 논리를 통해 문제를 해결할 수 : 열

1) 결정 수를 추가 할 수 있습니다.

2 )는

data test; 
input start end; 
informat start date9. end date9.; 
format start date9. end date9.; 
datalines; 
22-Jun-15 22-Oct-15 
09-Jan-15 15-May-15 
; 
run; 

/*******Determining number of columns*******/ 
data noc_cal; 
set test; 
no_of_col = floor((end-start)/30); 
run; 

proc sort data=noc_cal; 
by no_of_col; 
run; 

data _null_; 
set noc_cal; 
by no_of_col; 
if last.no_of_col; 
call symputx('number_of_columns',no_of_col); 
run; 

/*******Making an array where 1st iteration(tik1) is increased by 35days whereas others are incremented by 30days*******/ 
data test1; 
set test; 
array tik tik1-tik%sysfunc(COMPRESS(&number_of_columns.)); 
format tik: date9.; 
tik1 = intnx('DAYS',START,35); 
do i= 2 to %sysfunc(COMPRESS(&number_of_columns.)); 
tik[i]= intnx('DAYS',tik[i-1],30); 
if tik[i] > end then tik[i]=.; 
end; 
drop i; 
run; 

내 출력) 시저의 SQL을 사용하려는 해달라고 넣다 (

data test; 
input start end; 
informat start date9. end date9.; 
format start date9. end date9.; 
datalines; 
22-Jun-15 22-Oct-15 
09-Jan-15 15-May-15 
; 
run; 

/*******Determining number of columns*******/ 
data noc_cal; 
set test; 
no_of_col = floor((end-start)/30); 
run; 
proc sql; 
select max(no_of_col) into: number_of_columns from noc_cal; 
run; 

/*******Making an array where 1st iteration(tik1) is increased by 35days whereas others are incremented by 30days*******/ 
data test1; 
set test; 
array tik tik1-tik%sysfunc(COMPRESS(&number_of_columns.)); 
format tik: date9.; 
tik1 = intnx('DAYS',START,35); 
do i= 2 to %sysfunc(COMPRESS(&number_of_columns.)); 
tik[i]= intnx('DAYS',tik[i-1],30); 
if tik[i] > end then tik[i]=.; 
end; 
drop i; 
run; 

다른 방법 열 기준에 대한 요구 사항을 값을 계산 :

> **start |end  |tik1  | tik2  |tik3  |tik4** 
> 22Jun2015 |22Oct2015 |27Jul2015| 26Aug2015|25Sep2015|  
> 09Jan2015 |15May2015 |13Feb2015| 15Mar2015|14Apr2015|14May2015 
+0

나는 이것을 소화 할 시간이 더 필요하다! 출력은 필요에 따라 proc SQL을 사용하지 않는 것을 선호하지만 다시이 경우 간결함을 알 수 있습니다. 나는 이것을 통해 내 마음을 확실히 확장 할 것이다. 감사! – heroz

+0

@heroz proc sql을 사용하고 싶지 않다면 대신 다른 해결책을 추가했습니다. 코드에 대한 자세한 설명이 필요하면 알려주십시오. 또한, 내 대답이 당신의 질문을 해결하는 데 도움이된다면, 링크를 방문하십시오 : http://stackoverflow.com/help/someone-answers –

+0

그 위대한, 자세한 설명은 매우 도움이 될 것 같습니다.내가 가장 관심이있는 코드는 % sysfunc를 사용하여 변수 이름을 증가시키는 마지막 섹션입니다.이 섹션에서는이를 완료하기 위해 코드로 이동합니다. – heroz

0

나는 긴 수직 구조를 선호하는 경향이 있습니다. 나는 다음과 같이 접근 할 것입니다 :

data want; 
    set have; 
    tik=start+35; 
    do while(tik<=end); 
    output; 
    tik=tik+30; 
    end; 
    format tik mmddyy10.; 
run; 

정말 필요하다면, 두 번째 단계에서 해당 데이터 세트를 조 변경 할 수 있습니다.

+0

나는이 방법을 그렇게 생각하지 않았지만 앞으로 더 나아갈 가치가있다. 와이드는이 정보가 사용되는 방식 때문에 선호되며, 나는 전치를 들여다 보겠다 - 나는 항상 배우고있다. 이걸 제공해 줘서 고마워! – heroz

+0

나는 이것을 유용하다고 표시하고 싶지만 저의원이 적기 때문에 그것을 할 수 없습니다, 죄송합니다. – heroz

관련 문제