SAS PROC SQL; -创建DateTime变量

时间:2018-11-13 10:10:26

标签: sql datetime sas proc

我试图通过在PROC SQL中串联DATE变量(以DATE格式)和time变量(字符串hh:mm:ss)来创建过去3个小时的datetime变量。 ;

非常感谢您提供的任何帮助!

示例:

APPLCTN_DT  =  05NOV2018:00:00:00.000 
APPLCTN_TM  =  20:04:57

我想根据上述内容创建一个数字DATETIME字段

3 个答案:

答案 0 :(得分:0)

假定_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)

答案 1 :(得分:0)

由于看起来您的“ date”变量确实是一个零时间的DATETIME变量,您也许可以将时间部分添加到其中?

new_datetime =  APPLCTN_DT + input(APPLCTN_TM,time8.);

或者为了安全起见,您可以在添加时间部分之前将datetime值的时间部分强制为零。这有几种方法。

new_datetime =  dhms(datepart(APPLCTN_DT),0,0,input(APPLCTN_TM,time8.));
new_datetime =  intnx('dtdate',APPLCTN_DT,0) + input(APPLCTN_TM,time8.);

答案 2 :(得分:0)

实际上,您的代码接近结果,我认为您忘记了将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;