2012-12-04 8 views
1
%let months_back = %sysget(months_back); 

data; 
     m = intnx('month', "&sysdate9"d, -&months_back - 2, 'begin'); 
     m = intnx('day', put(m, date9.), 26, 'same'); 
     m2back = put(m, yymmddd10.); 
     put m2back; 
run; 

참고 : (라인) :(열) : 문자 값에 의해 주어진 장소에서 숫자 값으로 변환되고있다. 5시 19분 참고 : 잘못된 숫자 데이터, '01OCT2012'이 잘못 왜 난 정말 모르겠어요 라인 5 열 (19)SAS 날짜 또는 숫자 데이터?

에서. 날짜 문자열은 숫자 데이터입니까?

답변

4

PUT (m, date9.)이 문제의 원인입니다. INTNX의 두 번째 인수는 숫자 (즉, 날짜) 여야하며 PUT 함수는 항상 문자 값 (이 경우 '01OCT2012')을 반환합니다. PUT 기능을 완전히 꺼내면 코드가 작동합니다.

m = intnx('day', m, 26, 'same'); 
+0

감사합니다. 예, 두 번째 인수는 숫자 여야하며 m은 이미 숫자 유형입니다. "01OCT2022"와 같은 인수는 자동으로 숫자 유형으로 변환됩니다. put (m, date9.)는 데코레이터 'd'가없는 char 값을 반환하고 SAS는이를 변환하는 방법을 알지 못합니다. – bopie

1

SAS는 날짜를 숫자로 저장합니다. 실제로는 별개의 유형이 아닙니다. SAS 날짜는 1960 년 1 월 1 일 이후의 일 수로, 오늘은 19000 년 조금 넘습니다. 날짜 형식은 날짜 계산과 전혀 관련이 없습니다. 이는 사람이 읽을 수있는 용도로만 사용됩니다.

당신이 말하는 비트 :

"&sysdate9"d 

실제로 숫자 값 (18304)에 문자열 "01JAN2012"를 변환합니다.

실제로 수행하려는 작업을 수행하는 데 더 빠른 방법이 있습니다. 날짜는 SAS의 정수와 일치하기 때문에 하루 만 증가 시키면 값에 하나를 더할 수 있습니다. 예를 들어

:

%let months_back=5; 
data _null_; 
     m = intnx('month', today(), -&months_back - 2, 'begin'); 
     m2 = intnx('day', m, 26, 'same'); 
     m3 = intnx('month',"&sysdate9"d, -&months_back - 2)+26; 
     m2back = put(m2, yymmdd10.); 
     put m= date9. m2= yymmdd10. m3= yymmdd10.; 
run; 

M3는 다른이 아니라면 한 번에, (... '일')를 26 INTNX를 추가, 달 간격을 사용하여 전체 계산은 기본적으로 무의미하지 값을 함수를 사용하여 (예 : 이동 색인 사용).

여기에 PUT (로그) 문 형식의 사용을 볼 수도 있습니다. 문자 값으로 PUT 할 필요가 없으며 형식 값을 가져 오기 위해 로그에 넣지 않아도됩니다. var) (형식.); - 그리고 원하는만큼 많이 끈을 묶어 라.

또한 "& sysdate9."d는 현재 날짜를 가져 오는 가장 좋은 방법은 아닙니다. & sysdate. SAS의 시작시에만 정의되므로 세션이 3 일 동안 실행 되었다면 현재 날짜가되지 않습니다 (아마도 원하는 것일까요?). 대신, TODAY() 함수는 SAS 세션이 실행 된 시간에 관계없이 최신 날짜를 가져옵니다.

마지막으로 - 데이터 세트를 원하지 않으면 결과 데이터 세트의 이름을 지정하고을 권장합니다. data _null_은 데이터 집합을 만들지 않습니다. 데이터; 작업 공간을 빠르게 채우고 자신이하는 일을 말하기가 어려워지는 데이터 세트 (data1, data2, ...)가 점점 더 많이 생성됩니다.