我輩はブロガーではない。ネタもまだない

SASとかDelphiあたりの人様の役に立たないネタを提供します

TODフォーマットと注意点

todフォーマット、最近ではご存知方も多いと思います。
documentation.sas.com


9時20分36秒をtime8.フォーマットで表すと
「9:20:36」
となります。

これをtod8.フォーマットを使えば、先頭に0が埋められ、
「09:20:36」
となり、2桁時刻との桁の誤差が生じなくなります。
桁の誤差があると見づらくなるので、ログ出力等では大助かりです。


一方で、マイナスや24時間以上の時間の場合は注意が必要です。

timeフォーマットでは、マイナスも24時間以上もそのまま表記できますが、
todフォーマットでは、0-24時間に調整して表現されます。

プログラムとともに具体例を見ていきます。

data _null_;
  a='30:25:41't;
  put a=time8.;
  put a=tod8.;
run;

例えば、上記のプログラムの結果はこうなります。
f:id:japelin:20211007170155p:plain


マイナスについても

data _null_;
  a='-3:25:41't;
  put a=time8.;
  put a=tod8.;
run;

結果はこうなります。
f:id:japelin:20211007170340p:plain


(前回に引き続き)仕様のバグなのか、浮動小数点処理の誤差によるものなのか、マイナス小数の桁が大きな時はより注意が必要です。

こんなコードを用意しました。

data _null_;
  a=-0.123456789;
  put a=time20.10;
  put a=tod20.10;
run;

実行した結果は以下のようになります。
f:id:japelin:20211007170639p:plain

-0.123456789
なので、todフォーマットの結果は23:59:59.8765432110
となってほしいところです。

期待通りの結果としたい場合は、以下のように書きます。

data _null_;
  a=-0.123456789;
  put a=tod20.10;
  a='24:00:00't+a;
  put a=tod20.10;
run;

1日を足して、正の小数になおしてあげる、ということですね。