当 intck 函数不削减它时的 SAS 日期减法
SAS date subtraction when intck function doesn't cut it
我需要在我的 SAS 代码中做一些日期减法,但我不认为 INTCK 函数会起作用,因为我希望答案显示 days:hours:minutes 中的差异。我可以将它编程出来,但我猜可能有一种我不知道的格式或函数来完成任务。
例如:
日期 1 = 2000 年 1 月 1 日 12:00
日期 2 = 2000 年 1 月 2 日 14:30
差异 = 1:02:30(即 1 天 2 小时 30 分钟)
在这种情况下,如果我使用 INTCK,我需要将单位保留为天数或小时数,但我无法获得上面所需的格式。
您应该能够使用 PICTURE 格式的 %n
指令。
proc format;
picture pictdhmf
low-high='%0n:%0H:%0M'(datatype=time)
;
run;
请注意,您需要使用 TIME 数据类型。 警告:当 运行 SAS 使用 DBCS 支持(例如使用 Shift-JIS 编码)时,它不会产生正确的结果。或者对于小于零的时间。 当使用单字节字符集时,即使使用 UTF-8 编码,它也适用于非负值。
因此,您可以构建一个函数。
proc fcmp outlib=work.func.func;
function dhmf(c) $;
length f $ 10;
f=catx(':',datepart(abs(c)),put(timepart(abs(c)),tod5.));
if c < 0 then f='-'||f ;
return (f);
endsub;
run;
options cmplib=work.func;
然后制作调用函数的格式
proc format;
value dhmf(default=10)
other=[dhmf()];
run;
因此,如果我们测试这两种方法并与 TIME 格式生成的值进行比较。
data _null_;
input (date1 date2) (:datetime24.) ;
diff = date2 - date1 ;
if _n_=1 then put 'RAW' @11 'TIME.' @20 'Function' @ 30 'Picture';
put diff comma9. @11 diff time. @20 diff dhmf. @30 diff pictdhmf.-l ;
cards ;
01JAN2000:02:30 02JAN2000:03:45
01JAN1960:08:00 01JAN1960:17:00
01FEB2017:00:00 04FEB2017:06:23
01FEB2015:00:00 04FEB2017:06:23
04FEB2017:00:00 01FEB2017:06:23
run;
我们得到:
RAW TIME. Function Picture
90,900 25:15:00 1:01:15 1:01:15
32,400 9:00:00 0:09:00 0:09:00
282,180 78:23:00 3:06:23 3:06:23
63440580 17622:23 734:06:23 734:06:23
-236,220 -65:37 -2:17:37 -2:06:23
我需要在我的 SAS 代码中做一些日期减法,但我不认为 INTCK 函数会起作用,因为我希望答案显示 days:hours:minutes 中的差异。我可以将它编程出来,但我猜可能有一种我不知道的格式或函数来完成任务。
例如:
日期 1 = 2000 年 1 月 1 日 12:00
日期 2 = 2000 年 1 月 2 日 14:30
差异 = 1:02:30(即 1 天 2 小时 30 分钟)
在这种情况下,如果我使用 INTCK,我需要将单位保留为天数或小时数,但我无法获得上面所需的格式。
您应该能够使用 PICTURE 格式的 %n
指令。
proc format;
picture pictdhmf
low-high='%0n:%0H:%0M'(datatype=time)
;
run;
请注意,您需要使用 TIME 数据类型。 警告:当 运行 SAS 使用 DBCS 支持(例如使用 Shift-JIS 编码)时,它不会产生正确的结果。或者对于小于零的时间。 当使用单字节字符集时,即使使用 UTF-8 编码,它也适用于非负值。
因此,您可以构建一个函数。
proc fcmp outlib=work.func.func;
function dhmf(c) $;
length f $ 10;
f=catx(':',datepart(abs(c)),put(timepart(abs(c)),tod5.));
if c < 0 then f='-'||f ;
return (f);
endsub;
run;
options cmplib=work.func;
然后制作调用函数的格式
proc format;
value dhmf(default=10)
other=[dhmf()];
run;
因此,如果我们测试这两种方法并与 TIME 格式生成的值进行比较。
data _null_;
input (date1 date2) (:datetime24.) ;
diff = date2 - date1 ;
if _n_=1 then put 'RAW' @11 'TIME.' @20 'Function' @ 30 'Picture';
put diff comma9. @11 diff time. @20 diff dhmf. @30 diff pictdhmf.-l ;
cards ;
01JAN2000:02:30 02JAN2000:03:45
01JAN1960:08:00 01JAN1960:17:00
01FEB2017:00:00 04FEB2017:06:23
01FEB2015:00:00 04FEB2017:06:23
04FEB2017:00:00 01FEB2017:06:23
run;
我们得到:
RAW TIME. Function Picture
90,900 25:15:00 1:01:15 1:01:15
32,400 9:00:00 0:09:00 0:09:00
282,180 78:23:00 3:06:23 3:06:23
63440580 17622:23 734:06:23 734:06:23
-236,220 -65:37 -2:17:37 -2:06:23