Формат даты в базе SAS - PullRequest
       10

Формат даты в базе SAS

0 голосов
/ 18 января 2019

Я должен передать формат даты в Proc SQL в класс Where.

Формат даты примерно такой: «SAT 17 марта 01:29:17 IST 2018» (строковый столбец, длина 28)

Теперь, когда я попробовал ввод (Date, datetime18.) И некоторые другие функции даты, но все они дают мне ошибку. Ниже мой запрос

proc sql;
Select input(Date,datetime18.) from table;
quit;

Как преобразовать эту дату в простую дату, например "17-03-2018", чтобы я мог использовать ее в запросе proc SQL?

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Я использовал подстроку. Я создал новый столбец NEW_DATE в наборе данных. Как упоминалось выше, формат даты сб 17 марта 01:01:01 IST 2018 . Ниже приведен шаг данных для получения даты в формате ДД-МММ-ГГГГ

data new;
set old;
new_date = substr(date,9,2)||"-"||substr(date,5,3)||"-"||substr(date,25,4);
new_date_updated = input(new_date,date11.);
format new_date_updated date11.;
run;

тогда я использую новый столбец в proc sql

proc sql;
select * from new where new_date_updated>'17-Mar-2018'd;
quit;

и у меня это сработало.

Спасибо

Проверено выше, подход со всеми сценариями, работает нормально со всеми

0 голосов
/ 18 января 2019

дата числовая, и вы не должны сравнивать ее со строковым значением, сравнивайте ее с литералом даты, конвертируя ваше значение также в дату. сравнение больших и меньших значений со строками, как правило, не служит какой-либо цели и может привести к ошибочным результатам. меньше и больше чем имеет смысл / смысл при сравнении числовых переменных

 data have;
 b = "SAT Mar 17 01:29:17 IST 2018";
 output;
 b= "SAT Mar 19 01:29:17 IST 2018";
output;
 b= "SAT Jun 20 01:29:17 IST 2018";
output;
b= "SAT Mar 25 01:29:17 IST 2018";
output;
run;


proc sql;
select * from have
where input(cats(scan(b,3),scan(b,2), scan(b, -1)),date9.) > "19Mar2018"d;
0 голосов
/ 18 января 2019

Во многих случаях ANYDTDTM может быть хорошим источником информации, однако, как вы указали (в комментариях), это не так для формата даты и времени, представленного в вопросе.

Строка может быть перестроена в виде даты и времени в формате SAS с использованием cats и scan

data have;    
  date_string = "SAT Mar 17 01:29:17 IST 2018";    
run;

data want;
  set have;

  dt_wrong = input(date_string, anydtdtm.);

  dt_right = input ( cats 
          ( scan(date_string,3),
            scan(date_string,2),
            scan(date_string,6),':',
            scan(date_string,4)
          ), datetime20.);

  put date_string= /;
  put dt_right= datetime20. " from input of cats of string parts";
  put dt_wrong= datetime20. " from anydttm ";
run;

* sample macro that can be applied in data step or sql;

%macro dts_to_datetime(dts);
  input ( cats 
          ( scan( &dts , 3),
            scan( &dts , 2),
            scan( &dts , 6), ':',
            scan( &dts , 4)
          )
        , datetime20.)
%mend;

data want2;
  set have;
  dt_righton = %dts_to_datetime(date_string);

  format dt_righton datetime20.;

  put dt_righton=;
run;

Макрос также можно использовать в where инструкциях, таких как

where '18-Mar-2018:0:0'DT <= %dts_to_datetime (date_string)

Или SQL

, %dts_to_datetime (date_string) as event_dtm format=datetime20.
...