SASで日付や時間をどのように扱う?
SASでは、日付や時間、日時といった値を数値として管理しています。
具体的には、
- SAS日付値 : 1960/1/1を0とし、1日ごとに1増加する値。
- SAS時間値 : 0:00:00を0とし、1秒ごとに1増加する値。
- SAS日時値 : 1960/1/1 0:00:00を0とし、1秒ごとに1増加する値。
これらは負の値を取ることで、1960年以前の日時等を表現することもできます。
また、表示フォーマットを変更することで数値から見やすい形に変形することもできます。
もちろん変形しなくても数値として足し算や引き算をして、時間の差などを求めることもできます!
datetime、date、time関数
- datetime関数:現在の日時値を返す関数。
- date関数:現在の日付値を返す関数。
- time関数:現在の時間値を返す関数。
使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
data work.datetime; /*変数dtfmtの出力フォーマットをdatetime20.に定義。*/ format dtfmt datetime20.; /* dtfmt,dtに現在の日時値を代入。(ほぼ同じ値が入る。比較用)*/ dtfmt = datetime(); dt = datetime(); /* d,tにそれぞれ現在の日付値、時間値を代入。*/ d = date(); t = time(); run; |
これを実行すると、以下のようになります。
フォーマットの指定によって、見え方が変わっているのが分かります。
年月等を返す関数
もっと見やすくするために、ここでは年や月を返してくれる関数を紹介します。
関数 | 引数 | 返し値 |
Datepart | 日時値 | 日付値 |
Timepart | 日時値 | 時間値 |
Year | 日付値 | 年 |
Month | 日付値 | 月 |
Day | 日付値 | 日 |
Weekday | 日付値 | 曜日(日:0 月:1 … 土:7) |
Week | 日付値 | 週(その年の何週目か) |
Hour | 日時値or時間値 | 時 |
Minute | 日時値or時間値 | 分 |
Second | 日時値or時間値 | 秒 |
使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
data work.date_info; /*日時値を入れる*/ today_dt = datetime(); /*日付値を入れる*/ today_d = datepart(today_dt); /*時間値を入れる*/ today_t = timepart(today_dt); /*年を入れる*/ today_year = year(today_d); /*月を入れる*/ today_mon = month(today_d); /*日を入れる*/ today_day = day(today_d); /*曜日を入れる*/ today_wd = weekday(today_d); /*週を入れる*/ today_w = week(today_d); /*時を入れる*/ today_h = hour(today_t); /*分を入れる*/ today_min = minute(today_t); /*秒を入れる*/ today_s = second(today_t); run; |
出力はこのようになります。
少し小さいですが、このようになります。
フォーマットhhmmss8.とyymmdd8.を使ってみる
このフォーマットで時間を変形してあげることで、時間を足したり引いたりすることができるようになります。
試しに今日が残り何秒か、今年が残り何日かを算出するプログラムを書いてみましょう。先ほどのプログラムに、以下のものを書き足してみます。
1 2 3 |
nokori_sec = input("24:00:00",hhmmss8.)-time_part; nokori_day = input("20200101",yymmdd8.)-date_part; |
すると、このように、計算ができていることがわかります。