将ISO日期时间转换为SAS日期时间并计算时长问题求助
SAS字符型ISO日期时间转SAS datetime并计算时长差问题
问题背景
现有数据集extest,其中startdt和enddt是长度256的字符型变量,存储带时区的ISO格式日期时间,示例数据如下:
| ID | startdt | enddt |
|---|---|---|
| US12 | 2012-05-01T14:34-05:00 | 2012-05-01T14:45-05:00 |
| US13 | 2022-04-22T15:00-05:00 | 2022-04-22T17:00-05:00 |
需求:将上述字符型日期时间转换为指定格式的SAS datetime变量(如2012-05-01:14:34),并计算起止时间的时长差。
用户错误代码
data test (keep=stardat endat durtm); set extest; format stdat $20. tmdat $10. newdate datetime13.; stardat= exst_dt; enddat=exen_dt; durtm=; enddat - startdat run;
报错信息
- numeric values has been converted to character values at the places given by...
- invalid argument to function input at....
- mathematical operations could not performed at the following places...
问题原因及解决方案
问题原因
- 变量名不匹配:代码中使用
exst_dt/exen_dt,但实际数据集变量是startdt/enddt,导致读取不到正确的字符型日期值; - 直接对字符变量做减法:
enddat和stardat是字符型,无法直接进行数值运算,必须先转换为SAS数值型datetime变量; - 格式使用逻辑错误:未用
INPUT()函数配合对应输入格式完成字符到数值datetime的转换,直接操作字符变量引发类型错误。
修正后的代码
data test (keep=stardat endat durtm); set extest; /* 将带时区的字符型ISO日期时间转为数值型SAS datetime */ stardat = input(startdt, I8601DZ25.); enddat = input(enddt, I8601DZ25.); /* 指定显示格式为需求的YYYY-MM-DD:HH:MM样式 */ format stardat enddat datetime20.; /* 计算时长差,结果单位为秒(SAS datetime的最小单位) */ durtm = enddat - stardat; /* 若需转换为分钟/小时,可添加以下代码 */ /* durtm_min = durtm / 60; */ /* format durtm_min 8.1; */ run;
代码说明
I8601DZ25.输入格式:专门处理带时区偏移的ISO 8601日期时间字符串,长度25足够覆盖示例中的字符长度;datetime20.输出格式:对应显示为2012-05-01:14:34样式,若需要显示秒数可调整为datetime19.;durtm的结果是秒数,如需转换为分钟/小时,直接除以60/3600即可,可通过格式语句指定小数位数。
内容的提问来源于stack exchange,提问作者edc2sdtm
相关产品推荐
相关产品推荐

