時間的運算是許多研究中會遭遇到的問題,特別是探討值大夜班,或工作至翌日凌晨的職業醫學之相關研究。今日將介紹時間的資料格式與相關的函數,且依2種情形進行時間計算:
1. 計算24小時內的時間差
2. 跨夜的時間差
再依時間是否與日期結合,分為3種狀況:
1. 若時間與日期為不同變項
2. 若時間與日期已結合為同一個變項
3. 僅有時間資料(只能計算24小時的時間差,無法計算跨夜的時間差)
在介紹函數之前,先介紹SAS中的時間格式
【若時間與日期為不同變項】
以下的例子為時間與日期為不同變項的情況,但一般打卡鐘會將日期與時間結合,就不需要繁複的資料處理將兩者結合起來,但還是要依實際的資料型態作決定。
(程式說明)
以cards輸入1筆資料,共4個變項,包含2個日期(date1, date2)與2個時間(time1, time2)資料。這4個變項為外部資料,必須藉由轉換為SAS格式後,方可讀入。
在input指令後方,指定讀入的每個變項之資料型態,透過指定資料格式,即可轉換為SAS格式。
由於時間與日期是不同變項,因此需要透過DHMS(date, hour,munite, second)含數將兩者結合在一起,這個函數的argument(參數)必須有4個,包括date, hour,munite, second,所以需要將時間拆解成hour,munite, second。HOUR(), MUNITE()為取時間中的小時與分鐘,因外部資料檔無秒數資料,參數中的second直接以0取代。
兩者結合後,即可計算2014年4/16日23:50至2014年4/17日06:00的時間差,此時,可利用INTCK('時間單位',起始時間, 結束時間),且指定時間差為HOUR,可算出兩時間點相差幾小時,指定時間差為MUNITE,可算出兩時間點相差幾分鐘,若想知道相差幾小時又幾分鐘的分鐘,則須另外計算
最後利用format指定所有輸出到output視窗中的日期與時間之SAS格式,如此, 才可理解這些變項所代表的日期或時間意義。
data cc;
input date1:yymmdd10. time1:time5. date2:yymmdd10. time2:time5.;
hour1=hour(time1); munite1=minute(time1);
hour2=hour(time2); munite2=minute(time2);
datetime1=dhms(date1,hour1,munite1,0);
datetime2=dhms(date2,hour2,munite2,0);
mm=intck('munite',datetime1,datetime2); /*-兩時間點相差幾分鐘-*/
hour=intck('HOUR',datetime1,datetime2);/*-兩時間點相差幾小時-*/
mumite=(mm/60-hour)*60; /*--相差幾小時又幾分鐘的分鐘*/
cards;
2014-04-16 23:50 2014-04-17 06:00
;
proc print;
format date1 date2 yymmdd10. time1 time2 time5. datetime1 datetime2 datetime13.;
run;
結果
【若時間與日期已結合為同一個變項】
以下例子之時間與日期已結合為同一個變項,只需利用intck( )函數計算時間差即可。
data cc;
input datetime1:datetime13. datetime2:datetime13. ;
mm=intck('munite',datetime1,datetime2); /*-兩時間點相差幾分鐘-*/
hour=intck('HOUR',datetime1,datetime2);/*-兩時間點相差幾小時-*/
mumite=(mm/60-hour)*60; /*--相差幾小時又幾分鐘的分鐘*/
cards;
16APR14:23:50 17APR14:06:00
;
proc print;
format datetime1 datetime2 datetime13.;
run;
結果
【僅有時間資料】
以下例子無日期資料,SAS資料格式為time5.,因為無日期,無法計算跨夜時間差,只可計算24小時內的時間差,此時,起始時間為06:00,結束時間為23:50。
data cc;
input time1:time5. time2:time5. ;
mm=intck('munite',time1,time2); /*-兩時間點相差幾分鐘-*/
hour=intck('HOUR',time1,time2);/*-兩時間點相差幾小時-*/
mumite=(mm/60-hour)*60; /*--相差幾小時又幾分鐘的分鐘*/
cards;
06:00 23:50
;
proc print;
format time1 time2 time5.;
run;
結果
留言列表