如果原始数据是字符串格式的日期($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;