我有一个字符列,其字符格式为日期(dd / mm / yyyy)。
在应用过滤器(where子句)时,我需要在where语句中将这些字符识别为日期,而无需实际对现有列进行任何更改或创建新列。
我该如何做到这一点。 任何帮助将不胜感激。
谢谢。
答案 0 :(得分:2)
在proc sql
中,您可以接近like
:
select (case when datecol like '__/__/____'
then . . .
else . . .
end)
这只是一个近似值。 _
是一个通配符,它匹配任何字符,而不仅仅是数字。另一方面,这是标准SQL,因此可以在任何数据库中使用。
答案 1 :(得分:2)
带有INPUT
信息修饰符的SAS ?
函数会将字符串(源值)转换为结果,并且如果源值不符合 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;
答案 2 :(得分:0)
将日期存储为字符值不是一个好主意,它可能导致许多与数据准确性有关的问题,并且您甚至可能不知道很长一段时间内都有数据问题。说某人输入错误的字符日期,您甚至可能不知道。最好将日期保持为日期值而不是字符值
在您的代码中,使用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';
编辑1:
似乎有数据质量问题,样本数据集如下所示。尝试这个。我想再说一次将日期存储为字符值的方法不好,并且将来可能导致很多问题。
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
;
或者您可以放置case语句而无需添加和删除新列,如下所示。
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;