excel日付とSAS日付はどちらも日付を数値にしたものですが、そういえばこの二つは開始日が違ったな…ということがありましたので、忘れないように記事にします。こんな事めったにないとは思いますが。
この上記のexcelは、1行目に変数ラベル、2行目の変数名、3行目に日付(excel日付)が格納されています。これをsasにimportすると以下のようになります。仮なので読み込む際にオプションのgetnamesをyesにしたとしています。データとしてはexcel日付の列ですが、変数名がデータの値として格納されているので文字列として扱われた結果2024/5/2がexcel日付のまま45414として文字列になっています。ところで2024/5/2のsas日付は23498なのでこのまま日付を型変換すると2024/5/2になりません。45414は2084/5/3です。
11 data _null_ ;
12 a = '02may2024d'd ;
13 putlog a= ;
14 run ;
a=23498
excel日付は1が1900-1-1なのに対し、SAS日付は1が1960-1-2なので60年と1日の差があります。ちなみにSAS日付上での1960-1-1は0です。excel日付は1始まりですがSAS日付は0始まりということもこの時初めて知りました。
なのでexcel日付からSAS日付に変換する際には1900-1-1と1960-1-2の差分の(21915 + 1)をexcel日付側から引けば日付が一致します。以下の実行ログを見ると、引き算した後のEXDTには正しく2024-5-2が格納されていて、excelから読み込んだものをそのままformat当てたORGDTは2084-5-3となっています。
130
131 data _null_ ;
132 set sh1 ;
133
134 format EXDT yymmdd10. ;
135 format ORGDT yymmdd10. ;
136
137 if _n_ = 2 then do ;
138 ORGDT = label ;
139 EXDT = label - (21915 + 1) ;
140
141 putlog ORGDT= EXDT= ;
142 end ;
143
144 run ;
NOTE: 以下の箇所で文字値を数値に変換しました。(行:カラム)
138:17 139:16
ORGDT=2084-05-03 EXDT=2024-05-02
NOTE: データセットWORK.SH1から2オブザベーションを読み込みました。
NOTE: DATA ステートメント処理(合計処理時間):
処理時間 0.00 秒
CPU時間 0.00 秒