2016-05-12 17 views
0

私は日付フィールドがあり、たとえば、201603(CalendarYearMonth)と表示されます。この日付から90日を引いて、終了日が201512(RetentionYearMonth)になるようにしたいと考えています。私は別のテーブルから終了日を参照する必要があります。この日付に基づいてテーブルに参加しようとすると、201512が元のテーブルに20424、参加しようとしているテーブルの20423として表示されるため、一致しません。なぜ私は201512の2つの異なる値を得ているのでしょうか?数値フィールドYYYYMMを日付フィールドに変換して、90日を差し引いて新しいフィールドYYMMN6をフォーマットする方法を教えてください。サス?

私は次のことを試してみました:

DATA Quote2; 
SET Quote; 
YearMonth = INPUT(STRIP(PUT(CalendarYearMonth,6.))||'01',YYMMDD10.); 
RetentionYearMonth = YearMonth - 90; 
FORMAT RetentionYearMonth YYMMN6.; 
RUN; 

答えて

0

私は混乱しています。それのように書かれたルックスとしてあなたのコードは私に動作します:

37 DATA Quote2; 
38 CalendarYearMonth=201603; 
39 YearMonth = INPUT(STRIP(PUT(CalendarYearMonth,6.))||'01',YYMMDD10.); 
40 RetentionYearMonth = YearMonth - 90; 
41 put (CalendarYearMonth YearMonth RetentionYearMonth)(=); 
42 put RetentionYearMonth 8.; 
43 format YearMonth RetentionYearMonth mmddyy10.; 
44 RUN; 

CalendarYearMonth=201603 YearMonth=03/01/2016 RetentionYearMonth=12/02/2015 
    20424 

YEARMONTHは3月1日のためにSAS日付で、2016年RetentionYearMonthは(90日YEARMONTH前)2015年12月2日のためのSAS日付です。 2015年12月2日のSASの日付は20424です。

また、RetentionYearMonthは12月のSASの日付になると思われます。、2015?そうであれば、単純に90日を引くことはできません。しかし、あなたは例えば、おそらくINTNX機能を使用することができます。:

以上
53 DATA Quote2; 
54 CalendarYearMonth=201603; 
55 YearMonth = INPUT(STRIP(PUT(CalendarYearMonth,6.))||'01',YYMMDD10.); 
56 RetentionYearMonth = intnx('month',YearMonth,-3); 
57 put (CalendarYearMonth YearMonth RetentionYearMonth)(=); 
58 put RetentionYearMonth 8.; 
59 format YearMonth RetentionYearMonth mmddyy10.; 
60 RUN; 

CalendarYearMonth=201603 YearMonth=03/01/2016 RetentionYearMonth=12/01/2015 
    20423 
NOTE: The data set WORK.QUOTE2 has 1 observations and 3 variables. 

を、INTNXはYEARMONTH前に3ヶ月で月の開始のためにSASの日付を返します。

テーブルを結合するときは、(SASの日付をテキスト文字列に明示的に変換しない限り)保存された値が結合に使用されます。

0

「01MAR16'd」の特定の日付表現を除いて、テキストを使用してテキストを使用すると、SASであなたの人生はより頑丈になります。今度はINPUT(STRIP(PUT()))は必要ありません。

次に、intnxなどの組み込み関数を使用して、90日(または任意の他の任意の間隔)増分または減分することができます。

data quote3; calendaryearmonth = '01MAR16'd; retentionyearmonth = intnx('day',calendaryearmonth,-90); format retentionyearmonth yymmn6.; run;

はまた、私は、それは単に201603で、その後、あなたはそれから90日を引くcalendaryearmonthであなたの元のデータ値は、それに関連付けられた月の日を持っていないことを指摘し、これは比較的に定義されていません、あなたはそれを動作させることができますが、予期しない問題に遭遇する可能性もあります。論理的に考えると、これは90日ではなく3ヶ月を減算する方が意味があります。しかし、それはプログラミングの問題よりも問題の定義のほうが重要です。

+0

私はOPのコードを読んで、201603の値を持つCalendarYearMonthの数値変数を持っていました。SASの日付を取得するために、文字に変換して '01'を追加してからinput()を使ってSASに変換しました9060を引く前の日付です。これは201603から90を引くものではありません.90日ではなくINTNXで3ヶ月を引くことについて同意すると、それが問題の原因だと思います。 – Quentin

関連する問題