SAS: PROC SQL: Как прочитать символьный формат (дд / мм / гггг) как формат даты без создания нового столбца? - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть символьный столбец с датами (дд / мм / гггг) в формате символов.

При применении фильтра (предложение where) мне нужно, чтобы эти символы распознавались как даты в выражении where, без внесения каких-либо изменений в существующий столбец или без создания нового столбца.

Как я могу сделать это. Любая помощь будет принята с благодарностью.

Спасибо.

Ответы [ 3 ]

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

Не очень хорошая идея хранить дату как символьное значение, это может привести к большому количеству проблем, связанных с точностью данных, и вы можете даже не знать, что у вас есть проблемы с данными в течение длительного времени. скажем, кто-то вводит неправильную дату персонажа, и вы можете даже не знать. всегда полезно поддерживать дату как значение даты, а не как символьное значение

В вашем коде Фильтр дат с использованием like становится немного сложным для дат. Вы можете попробовать приведенный ниже код, который будет работать для вас, используя оператор ввода в выражении where

 data have;
 input id datecolumn $10.;
  datalines;
  1 20/10/2018
  1 25/10/2018
  2 30/10/2018
  2 01/11/2018
  ;

 proc sql;
 create table want as 
  select *  from have
 where input(datecolumn, ddmmyy10.) between '20Oct2018'd and '30Oct2018'd ;

используя как показано ниже для того же кода

proc sql;
create table want as 
 select *  from have
 /*include all dates which start with 2 */
 where datecolumn like '2%' and  datecolumn like '%10/2018' 
 or datecolumn = '30/10/2018';

Edit1:

похоже, у вас проблема с качеством данных, и пример набора данных показан ниже. попробуй это. Еще раз хочу сказать, что подход к сохранению дат, так как значения символов не годится и может привести к большому количеству проблем в будущем.

   data have;
  input id datecolumn $10.;
  datalines;
   1 20/10/2018
   1 25/10/2018
   2 30/10/2018
   2 01/11/2018
   3 01/99/2018
   ;

   proc sql;
  create table want(drop=newdate) as 
  select *,  case  when input(datecolumn, ddmmyy10.) ne .
                  then input(datecolumn, ddmmyy10.)
                    else . end as newdate from have
where calculated newdate between '20Oct2018'd and '30Oct2018'd 

;

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

    proc sql;
    create table want as 
    select * from have
     where 
    case  when input(datecolumn, ddmmyy10.) ne .
    then input(datecolumn, ddmmyy10.) between '20Oct2018'd and '30Oct2018'd 
    end;
0 голосов
/ 08 ноября 2018

Функция SAS INPUT с модификатором ? informat преобразует строку (исходное значение) в результат, а not показывает ошибку, если исходное значение не соответствует информации.

INPUT может использоваться в операторе или предложении WHERE. Ввод также может быть частью оператора BETWEEN.

* some of these free form values are not valid date representations;

data have;
  length freeform_date_string $10;
  do x = 0 to 1e4-1;
    freeform_date_string = 
      substr(put(x,z4.),1,2) || '/' ||
      substr(put(x,z4.),3,2) || '/' ||
      '2018'
    ;
    output;
  end;
run;

* where statement;

data want;
  set have;
  where input(freeform_date_string,? ddmmyy10.);
run;

* where clause;

proc sql;
  create table want2 as
  select * from have
  where 
    input(freeform_date_string,? ddmmyy10.) is not null
  ;

* where clause with input used with between operator operands;

proc sql;
  create table want3 as
  select * from have
  where 
    input(freeform_date_string,? ddmmyy10.) 
    between
      '15-JAN-2018'D
    and
      '15-MAR-2018'D
  ;
quit;
0 голосов
/ 08 ноября 2018

В proc sql вы можете приблизиться к like:

select (case when datecol like '__/__/____'
             then . . . 
             else . . .
        end)

Это только приблизительное значение. _ - это подстановочный знак, который соответствует любому символу, а не только цифрам. С другой стороны, это стандартный SQL, поэтому он будет работать в любой базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...