Не очень хорошая идея хранить дату как символьное значение, это может привести к большому количеству проблем, связанных с точностью данных, и вы можете даже не знать, что у вас есть проблемы с данными в течение длительного времени. скажем, кто-то вводит неправильную дату персонажа, и вы можете даже не знать. всегда полезно поддерживать дату как значение даты, а не как символьное значение
В вашем коде Фильтр дат с использованием 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;