SAS PROC SQL; - создание переменной DateTime - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь создать переменную даты и времени за последние 3 часа ... путем объединения переменной DATE (в формате DATE) и переменной time (строка чч: мм: сс) в PROC SQL;

Буду очень признателен за любую помощь в этом!

Пример:

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

Я хотел бы создать числовое поле DATETIME на основе вышеуказанного

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Так как ваша переменная "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.);
0 голосов
/ 21 ноября 2018

На самом деле, ваш код близок к результату, я думаю, вы забыли перевести формат даты SAS в формат отображения.

с использованием функции put в переменной target_minus_3hr_dt & target_minus_3hr_exact_dt, поскольку дата 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;
0 голосов
/ 13 ноября 2018

Предполагается, что переменная _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)
...