Настройка часа для учета разницы во времени - PullRequest
0 голосов
/ 03 августа 2020

У меня есть проверка на редактирование

«Если Период = 1,2,3 или 4 и Час исследования = 1, то время должно быть 1 час плюс-минус 15 минут после введения дозы исследуемого препарата из тот же период ». Они должны быть запрограммированы на +/- 20-минутное окно рабочего часа 1.00 (относительно их времени дозирования). Это окно протокола, поэтому, даже если мероприятие было запланировано не точно на 1 час, мы ищите окно отклонения от 1 часа, а не от временной точки события. Вот объединенные данные

введите описание изображения здесь

Это мой код. У меня много флагов, так что я делаю не так? Для контекста существует переменная prothour, равная 1, но фактическая временная точка равна 0,77. Должен ли я как-то отрегулировать 0,77, чтобы учесть это?

data medfst;
    set dm.ex;
    ptno=strip(compress(clientid,'-'))+0; 
    if ex_stdat=. or ex_sttim=. then delete;
    medday= day;
    rename hour=medhour;

proc sort; 
    by ptno period day medhour;
run;

data medfst; 
    set medfst;
    by ptno period;
    if first.period;
    ex_datetime1=put(ex_stdat,date9.-r)||' '||put(ex_sttim,time8.-l);
    ex_datetime=input(ex_datetime1,datetime20.);

    keep scrid clientid ptno period ex_datetime ex_stdat ex_sttim medhour day;
    format ex_datetime datetime20.;

proc sort; 
 by ptno period day medhour;
run;


data vs;
    set dm.vs;
    ptno=strip(compress(clientid,'-'))+0;
    if VS_TEST in ('SYSTOLIC'); 
    if prothour in ('1');

proc sort nodupkey;
    by ptno period day hour;
run;

data vs1; 
    set vs;

    vs_datetime1=put(vs_dat,date9.-r)||' '||put(vs_tim,time8.-l);
    vs_datetime=input(vs_datetime1,datetime20.);

    keep scrid clientid day hour ptno period vs_dat vs_tim vs_datetime vs_com;      
    format vs_datetime datetime20.;

proc sort; 
 by ptno period day;
run;

data temp;
    merge medfst (in=a) vs1;
    by ptno period;
    if a;
run; 
data final_temp; 
    set temp;
    newhour=hour-medhour;
    datediff=vs_dat-ex_stdat;
    timediff=vs_tim-ex_sttim;
    diff=datediff*24*3600+timediff;

    newdiff=round(diff-newhour*(60*60));
    format diff time8. newdiff time8. timediff time8.;
run;


data final;
    set final_temp;

%inc_subjs;

*****                                                                                               *****;
*********************************************************************************************************;

attrib extra reason length=$5000.;        
*********************************************************************************************************;
*                                     Edit check code and footnote                                      *;
*****                                                                                               *****;



if abs(diff) lt '00:45:00't or abs(diff) gt '01:15:00't then do; 
    reason=trim(reason)||'If Period = 1,2,3 or 4 and Study Hour = 1 then the Time should be 1 hour plus or minus 15 minutes post dose of study drug from the same period#'; 
    extra = trim(extra)||', Hour based on Dose = '||trim(left(medhour))||', Vital Signs hour = '||trim(left(prothour))||', Time deviated = '||trim(put(diff,time8.))||', comment = '||trim(left(vs_com)); 
end;

1 Ответ

1 голос
/ 03 августа 2020

Вы можете округлить до ближайшего кратного числа, используя второй аргумент функции ROUND.

ROUND (аргумент <, блок округления> )

Обязательный аргумент

аргумент

  • - это числовая c константа, переменная или выражение для быть округленным.

Необязательный аргумент

единица округления

  • является положительным числом c константа, переменная, или выражение, определяющее единицу округления.

Округление значения времени до ближайшего часа (время - секунды, час - 3600 секунд)

closest_hour = ROUND(mytime, 3600);

Круглый час ( число) до ближайшего часа (значение времени)

closest_hour = ROUND(myhour*3600, 3600);

и, конечно же, от часа (числа) до ближайшего целого часа (числа)

closest_hr = ROUND(myhour);  * default rounding unit is 1;
...