2016-12-14 15 views
0

私は変換しようとしている以下のコードでこの圧縮関数に苦労しています。SASの日付マクロと圧縮関数

古いコード(このコードは動作し、以下の結果を返す)

data _null_; 
%let startdt='2015/11/1'; 
date_num=compress(&startdt,"'"); 
call symputx('date_num',date_num); 
%put &startdt; 
%put &date_num; 
run; 

このコードは、2015年11月1日として2015年11月1日と関数datenumとしてマクロ変数startdtの値を返します。

私は、日付のマクロ変数を使用して同様の機能を実現しようとしています。

新しいコード:(このコードは私にエラーを与え、私は理由を理解することはできませんよ)

data _null_; 
dt = date(); 
last_mth_beg = intnx('month',dt,-1,'beginning'); 
call symput('startdt',put(last_mth_beg,YYMMDDS10.)); 
date_num=compress(&startdt,"'"); 
call symputx('date_num',date_num); 
%put &startdt; 
%put &date_num; 
run; 

私はこの新しいコードを実行すると、私はエラーを取得しています。私は古いコードのように結果を得たいと思います。 助けてください。ありがとうございました!

+0

見るあなたの '%LET'移動と '%PUT'ステートメントをデータステップの前または後のいずれかに追加することができます。これはSASがそれらを評価するときにコードを読みやすく理解しやすくするからです。データステップの途中にそれらを置くと、データステップが実行されている間にどのように評価されているかのように見えますが、これは当てはまりません。これで問題は解決しますか? – Tom

+0

こんにちは、それでも問題は解決しません。エラーは、letステートメントを持たない「新規コード」にあります。ありがとう! – PJay

+0

2番目のデータステップもうまく動作するはずですが、 '%PUT'ステートメントを' run; 'ステートメントの後に移動する必要があります。それ以外の場合は、マクロ変数が存在しない、あるいは悪いことに、データステップが実行される前の値を表示するというエラーが生成されます。 – Tom

答えて

0

最初のデータステップでは、マクロ変数から引用符を削除するだけです。マクロコードでこれを行うには、%sysfunc()を使用してcompress()関数を呼び出します。あるいは、%scan()機能を使用するだけでも可能です。

%let date_num = %scan(&startdt,1,%str(%')); 

第2のものでは、日付値にINTNX()関数を使用しようとしているようです。しかし、マクロ変数には日付の値は含まれていません。 '2015/11/1'を日付のように扱いたい場合は、まず入力関数を使用して変換する必要があります。

%let last_mth_beg = %sysfunc(intnx(month,%sysfunc(inputn(&date_num,yymmdd10)),-1,b),yymmdd10); 
+0

私は日付のハードコーディングを避けることによって達成しようとしている結果であるため、参照用に古いコードを追加しました。私は上記のステートメントを使ってみましたが、今は欠落しています。ありがとう! – PJay

+0

コードが正常に動作します。マクロ変数STARTDTにYYYY/MM/DD形式のベーダ日付があり、その周りに一重引用符があるものと仮定しています。 YYYY/MM/DD形式の新しいマクロ変数LAST_MTH_BEGが生成されますが、一重引用符は使用されません。 – Tom

0

なぜ古いコードでエラーが表示されないのかわかりません。最初に実行すると、エラーが表示されます。

警告:見た目のはっきりしたDATE_NUMは解決されていません。

次に、データステップ実行後、&DATE_NUMに値が設定されます。データステップ内に%PUTを使用して、データステップ内に作成するマクロ変数を表示することはできません。

コードの2番目のセットでは、作成するマクロ変数STARTDTの値には、最初にその周りに一重引用符がありません。あなただけの次のコマンドを実行した場合、あなたは正しい結果を得るだろう:私はそれを実行すると

data _null_; 
dt = date(); 
last_mth_beg = intnx('month',dt,-1,'beginning'); 
call symput('startdt',put(last_mth_beg,YYMMDDS10.)); 
run; 

%put &startdt; 

を、私は

2016年11月1日