SAS 过程 SQL; - 创建日期时间变量
SAS PROC SQL; - creating DateTime variable
我正在尝试创建过去 3 小时的日期时间变量...通过连接 DATE
变量(日期格式)和 time
变量(字符串 hh:mm:ss)过程 SQL;
非常感谢对此的任何帮助!
示例:
APPLCTN_DT = 05NOV2018:00:00:00.000
APPLCTN_TM = 20:04:57
我想根据以上
创建一个数字DATETIME
字段
假设 _DT 变量实际上是一个没有确切时间部分(因此只有日期)的日期时间值。
使用DATEPART
提取SAS日期值,INPUT
将时间字符串转换为时间值,DHMS
构建目标日期时间值,INTNX
计算与目标的新日期时间值偏移量。
data _null_;
APPLCTN_DT = '05NOV2018:00:00:00.000'dt ;
APPLCTN_TM = "20:04:57";
date_part = datepart(applctn_dt);
time_part = input(applctn_tm,time8.);
target_dt = dhms(date_part,0,0,0) + time_part;
target_minus_3hr_dt = intnx ('dthour'
, dhms(date_part,0,0,0) + time_part
, -3
);
target_minus_3hr_exact_dt = intnx ('dtsecond'
, dhms(date_part,0,0,0) + time_part
, -3*60*60
);
format target: datetime20.;
put target_dt ' combined';
put target_minus_3hr_dt ' combined, 3 hours ago';
put target_minus_3hr_exact_dt ' combine, exactly three hours ago (to the second)';
run;
将显示在日志中
05NOV2018:20:04:57 combined
05NOV2018:17:00:00 combined, 3 hours ago
05NOV2018:17:04:57 combine, exactly three hours ago (to the second)
因为看起来你的 "date" 变量实际上是一个时间为零的 DATETIME 变量,你也许可以只向它添加时间部分?
new_datetime = APPLCTN_DT + input(APPLCTN_TM,time8.);
或者为了安全起见,您可以在添加时间部分之前强制日期时间值的时间部分为零。这里有几种方法。
new_datetime = dhms(datepart(APPLCTN_DT),0,0,input(APPLCTN_TM,time8.));
new_datetime = intnx('dtdate',APPLCTN_DT,0) + input(APPLCTN_TM,time8.);
实际上,您的代码与结果很接近,我想您忘记了将 SAS 日期格式转换为显示格式。
在变量 target_minus_3hr_dt & target_minus_3hr_exact_dt 中使用 put 函数,
由于SAS日期显示为数字,所以我们需要使用put函数来传输。
data _null_;
APPLCTN_DT = '05NOV2018:00:00:00.000'dt ;
APPLCTN_TM = "20:04:57";
date_part = datepart(applctn_dt);
time_part = input(applctn_tm,time8.);
target_dt = put(date_part,date9.)||applctn_tm;
target_minus_3hr_dt = put((intnx ('dthour'
, dhms(date_part,0,0,0) + time_part
, -3
)),datetime20.);
target_minus_3hr_exact_dt = put((intnx ('dtsecond'
, dhms(date_part,0,0,0) + time_part
, -3*60*60
)),datetime20.);
put target_dt ' combined';
put target_minus_3hr_dt ' combined, 3 hours ago';
put target_minus_3hr_exact_dt ' combine, exactly three hours ago (to the second)';
run;
我正在尝试创建过去 3 小时的日期时间变量...通过连接 DATE
变量(日期格式)和 time
变量(字符串 hh:mm:ss)过程 SQL;
非常感谢对此的任何帮助!
示例:
APPLCTN_DT = 05NOV2018:00:00:00.000
APPLCTN_TM = 20:04:57
我想根据以上
创建一个数字DATETIME
字段
假设 _DT 变量实际上是一个没有确切时间部分(因此只有日期)的日期时间值。
使用DATEPART
提取SAS日期值,INPUT
将时间字符串转换为时间值,DHMS
构建目标日期时间值,INTNX
计算与目标的新日期时间值偏移量。
data _null_;
APPLCTN_DT = '05NOV2018:00:00:00.000'dt ;
APPLCTN_TM = "20:04:57";
date_part = datepart(applctn_dt);
time_part = input(applctn_tm,time8.);
target_dt = dhms(date_part,0,0,0) + time_part;
target_minus_3hr_dt = intnx ('dthour'
, dhms(date_part,0,0,0) + time_part
, -3
);
target_minus_3hr_exact_dt = intnx ('dtsecond'
, dhms(date_part,0,0,0) + time_part
, -3*60*60
);
format target: datetime20.;
put target_dt ' combined';
put target_minus_3hr_dt ' combined, 3 hours ago';
put target_minus_3hr_exact_dt ' combine, exactly three hours ago (to the second)';
run;
将显示在日志中
05NOV2018:20:04:57 combined
05NOV2018:17:00:00 combined, 3 hours ago
05NOV2018:17:04:57 combine, exactly three hours ago (to the second)
因为看起来你的 "date" 变量实际上是一个时间为零的 DATETIME 变量,你也许可以只向它添加时间部分?
new_datetime = APPLCTN_DT + input(APPLCTN_TM,time8.);
或者为了安全起见,您可以在添加时间部分之前强制日期时间值的时间部分为零。这里有几种方法。
new_datetime = dhms(datepart(APPLCTN_DT),0,0,input(APPLCTN_TM,time8.));
new_datetime = intnx('dtdate',APPLCTN_DT,0) + input(APPLCTN_TM,time8.);
实际上,您的代码与结果很接近,我想您忘记了将 SAS 日期格式转换为显示格式。
在变量 target_minus_3hr_dt & target_minus_3hr_exact_dt 中使用 put 函数, 由于SAS日期显示为数字,所以我们需要使用put函数来传输。
data _null_;
APPLCTN_DT = '05NOV2018:00:00:00.000'dt ;
APPLCTN_TM = "20:04:57";
date_part = datepart(applctn_dt);
time_part = input(applctn_tm,time8.);
target_dt = put(date_part,date9.)||applctn_tm;
target_minus_3hr_dt = put((intnx ('dthour'
, dhms(date_part,0,0,0) + time_part
, -3
)),datetime20.);
target_minus_3hr_exact_dt = put((intnx ('dtsecond'
, dhms(date_part,0,0,0) + time_part
, -3*60*60
)),datetime20.);
put target_dt ' combined';
put target_minus_3hr_dt ' combined, 3 hours ago';
put target_minus_3hr_exact_dt ' combine, exactly three hours ago (to the second)';
run;