使用proc sql-sas将时间从字符转换为数字

使用proc sql-sas将时间从字符转换为数字,sas,proc-sql,Sas,Proc Sql,我在计算小时数时遇到了问题,因为时间是字符格式的 Booked_from($) booked_to($) ====================================== 07:00 18:00 08:00 17:00 我想要这两个字段之间的差异,并创建一个新字段“小时” 我的代码: booked_Hours=intck(minutes,attendee.booked_to,attendee.booked_from) 但是它给出了一

我在计算小时数时遇到了问题,因为时间是字符格式的

Booked_from($)   booked_to($)
======================================
07:00            18:00
08:00            17:00
我想要这两个字段之间的差异,并创建一个新字段“小时”

我的代码:

booked_Hours=intck(minutes,attendee.booked_to,attendee.booked_from)

但是它给出了一个错误,下面的代码说明了使用intck和使用informat将字符转换为数字的正确方法:

data _NULL_;
  input Booked_from $  booked_to $;
  minutes=intck('minutes',input(booked_from,time5.),input(booked_to,time5.));
  hours=intck('hours',input(booked_from,time5.),input(booked_to,time5.));
  put _all_;
  datalines;
  07:00            18:00
  08:00            17:00
  ;
run;
正如我在评论中提到的,如果您想要“小时”,那么您需要指定“小时”的间隔类型,而不是分钟


此外,我还颠倒了第二个和第三个参数的顺序,因为原始方法给出的是负值。

以下代码说明了使用
intck
并使用informat将字符转换为数字的正确方法:

data _NULL_;
  input Booked_from $  booked_to $;
  minutes=intck('minutes',input(booked_from,time5.),input(booked_to,time5.));
  hours=intck('hours',input(booked_from,time5.),input(booked_to,time5.));
  put _all_;
  datalines;
  07:00            18:00
  08:00            17:00
  ;
run;
正如我在评论中提到的,如果您想要“小时”,那么您需要指定“小时”的间隔类型,而不是分钟


另外,我颠倒了第二个和第三个参数的顺序,因为原始方法给出的是负值。

除了前面的答案,我还有一点要补充。如果Booked_from为23:30,Booked_to为1:00,则必须使用条件语句来计算差异。在这种情况下,您将获得负数形式的差异值

下面的代码将帮助您解决此问题

data mins;
    set <your dataset>;
    attrib fromtime totime format=time5.;

    fromtime=input(booked_from,time5.);
    totime=input(booked_to,time5.);

    if(totime < fromtime) then do;
        min=intck('minutes',fromtime,'24:00't)+intck('minutes','00:00't,totime);
    end;
    else do;
        min=intck('minutes',fromtime,totime);
    end;
run;
数据分钟;
设置
attrib fromtime totime格式=时间5。;
fromtime=输入(预订时间,时间5.);
totime=输入(预定到,时间5.);
如果(totime
除了前面的答案,我还要补充一点。如果Booked_from为23:30,Booked_to为1:00,则必须使用条件语句来计算差异。在这种情况下,您将获得负数形式的差异值

下面的代码将帮助您解决此问题

data mins;
    set <your dataset>;
    attrib fromtime totime format=time5.;

    fromtime=input(booked_from,time5.);
    totime=input(booked_to,time5.);

    if(totime < fromtime) then do;
        min=intck('minutes',fromtime,'24:00't)+intck('minutes','00:00't,totime);
    end;
    else do;
        min=intck('minutes',fromtime,totime);
    end;
run;
数据分钟;
设置
attrib fromtime totime格式=时间5。;
fromtime=输入(预订时间,时间5.);
totime=输入(预定到,时间5.);
如果(totime
intck函数的第一个参数需要用引号括起来。请参考链接了解如何使用intck函数计算小时、分钟等:这不是唯一的问题,时间值是字符,因此您需要使用
input
转换它们:
input(attendee.booked\u from,time5.)
。此外,当字段计算分钟时,您会将其称为“小时”,这似乎很奇怪!intck函数的第一个参数需要用引号括起来。请参考链接了解如何使用intck函数计算小时、分钟等:这不是唯一的问题,时间值是字符,因此您需要使用
input
转换它们:
input(attendee.booked\u from,time5.)
。此外,当字段计算分钟时,您会将其称为“小时”,这似乎很奇怪!