如果原始数据是字符串格式的日期($16.),类似:

STDTC                       ENDTC

2022-01-03                2022-01-03

2022-03-22                2022-05-02

2022-06-02T10:30     2022-06-04 

虽然字符串是ISO8601的样子,但此时如果对二者进行计算,必须先转换为数值格式:

data have;
input STDTC $16. ENDTC :$16.;
cards;
2022-01-03                2022-01-03
2022-03-22                2022-05-02
2022-06-02T10:30          2022-06-04 
;
data want;
     set have;
     stdtn=input(stdtc,B8601DT.); format stddn E8601DT.;
     endtn=input(endtc,B8601DT.); format endtn E8601DT.;
     delta=endtn-stdtn;   
     format delta time16.;
run;
注意这里不可以用 input(stdtc, E8601DT.), 会提示 invalid argument for INPUT. 原因是

 所以当字符串中同时有 date 和 datetime 日期时,就只能用 B8601DT.  

当字符串只有date时,则用 dt=input(endtc,e8601da.); format dt e8601da.; 修改为数值型 e8601da 格式。

当字符串全部是datetime时,则用 dt=input(endtc,e8601dt.); format dt e8601dt.; 修改为数值型 e8601dt 格式。 e8601dt 默认是19位,要改成16位用e8601dt16. 

data have;
input STDTC $16. ENDTC :$16.;
cards;
2022-06-02T10:30          2022-06-04T10:50 
;
data want;
     set have;
     dt=input(endtc,E8601DT.); format endtn E8601DT.;
   dt2=input(endtc,E8601DT.); format endtn E8601DT16.;
run;

 

 

 




posted on 2022-09-15 21:51  MOZY  阅读(1816)  评论(1编辑  收藏  举报