2018年6月24日日曜日

SAS飲み会に行ってきたお話

なにやら大層なブログタイトルになってしまいましたが.
単にネタを持ち寄りましょう,という簡単な会に6月23日に行ってきました.

18:30開始,会場が梅田となってはそこそこ早めに会社を出ないと行けません.しかしプログラム書いてると意外と遅くなり,すわ遅刻か.となりながらも退勤.会場へ急ぐ.

道中急いでいたため軽食と飲み物のことをすっかり失念しており,はたと思い至ったときには時すでに遅し,あたりにコンビニはない.これは21:30まで飲まず食わずかと覚悟を決めるが,自販機を発見しお茶を買うことには成功する.軽食は無く空腹と共に人の発表を聞くか...とがっくり肩を落としながらも引き続き会場へと急ぐ.

当日の会場がわかりにくいビルで,ビルにたどり着くまでに同じ道を行ったり来たり.この筋のはずなんだがなぁとウロウロし,なんとかビルを見つけて(なんと2度もそのビルの前を素通りしていた)建物内に入る.
なんと建物の中でも迷子になってしまい,あちこちさ迷い歩く羽目に.壁に並ぶ不審者に注意の張り紙が大変心に響いた.

ほうほうの体で会場へin.全員揃うのをまち,本日のネタお披露目が始まる.

私は今回はsgplotのオプションをいくつか紹介すると言う,目新しさのかけらもない微妙なネタを持っていきました.

私のは手垢のついたネタなのでいいのですが,classdataオプション(proc means)やweightステートメントのzeroオプション(proc freq),果てはフレームワークのようなもの(プログラムの定型部分を自動で行うなど)などと出るわ出るわ盛り沢山ですね.

classdataオプション,存在は知っていましたが使ったことなかったですねー.いっつもダミーデータをmergeしてましたね...一度使ってみましょう.

次は忘年会のシーズンに集まる感じですかね.またその時はどんなネタが出てくるか,今から楽しみです.

最後になりましたが,来てくださった皆様,これなかった皆様,ありがとうございました.

2018年6月15日金曜日

call is8601_convertルーチンの話

is8601_convertコールルーチンは,日付や2つの日付の間の間隔をiso8601フォーマットに変換します.
この日付の間隔のことを,デュレーション値と呼ぶようです.
たとえば始点が4月1日,終点が4月2日のとき,デュレーション値は1日です.
第一引数に変換前の値に何が入るかを指定し,第二引数に変換後の値が何であるかを指定します.
第三引数に変換前の値,第四引数に変換に使う値,第五引数に変換後の値を格納する変数を指定します.

第一引数に'du/dt'と指定すると,第三引数にデュレーション値,第四引数に日付を指定します.
これが逆になるとエラーが返ります.
同様に'dt/du'と指定すると,日付→デュレーション値の順に指定をしないといけません.

とてつもなくわかりにくいので以下にいくつか具体例を示します.

data _null_ ;
  format hoge e8601dn. ;
  /*変換前の値はデュレーション値と日付,変換後に期間の開始日を出力,期間は8週間,期間の終点は2018年1月1日*/
  call is8601_convert('du/dt' , 'start' ,"p8w" ,"2018-01-01" ,  hoge ) ;
  putlog hoge = ;
run ;

hoge=2017-11-06


data _null_ ;
  format hoge e8601dn. ;
  /*変換前の値は日付とデュレーション値,変換後に期間の終了日を出力,期間の開始日は2018年1月30日,期間は8週間*/
  call is8601_convert('dt/du' , 'end' ,"2018-01-30" ,"p8w" , hoge ) ;
putlog hoge = ;
run ;

hoge=2018-03-27


data _null_ ;
  length hoge $20 ;
  format hoge $n861b. ;
  /*変換前の値に日付と日付,変換後はデュレーション値,期間の始点は1月30日,終点は3月14日*/
  call is8601_convert('dt/dt' , 'du' ,"2018-01-30T12:30" ,"2018-03-14T14:45" , hoge ) ;
  putlog hoge = ;
run ;

hoge=P1M15DT2H15M