在SAS中比较日期(Date1=Date2)
我想比较SAS数据集中的两个日期,即does date1=date2。我试图使用ifn和ifc函数来实现这一点,但怀疑它们工作不正常。我直接从sugi中获取了这段代码,但是使用这些函数成功地比较了字符/数字变量。我还成功地尝试了使用proc-sql进行比较,但我想在数据步骤中学习如何进行比较 我的代码如下:在SAS中比较日期(Date1=Date2),date,sas,Date,Sas,我想比较SAS数据集中的两个日期,即does date1=date2。我试图使用ifn和ifc函数来实现这一点,但怀疑它们工作不正常。我直接从sugi中获取了这段代码,但是使用这些函数成功地比较了字符/数字变量。我还成功地尝试了使用proc-sql进行比较,但我想在数据步骤中学习如何进行比较 我的代码如下: data not_in_HDD_3; set not_in_HDD_2; start=STMT_PERIOD_FROM; if start=. then start=ADMI
data not_in_HDD_3;
set not_in_HDD_2;
start=STMT_PERIOD_FROM;
if start=. then start=ADMIT_START_OF_CARE;
start_2=input(start, ANYDTDTE8.);
format start_2 MMDDYY10.;
drop start;
rename start_2=start;
dob=input(birth_date, ANYDTDTE8.);
format dob MMDDYY10.;
Birth_record = ifn (start eq dob, 0 , 1);
ifc_result = ifc(start=dob,"True","False","Missing");
ifn_result = ifn(start=dob,1,0,.);
ifn_result_fmt = put(ifn_result,ifn_label.);
fuzz_result = ifc(fuzz(start-dob),"True","False","Missing");
drop ifn_result;
run;
proc sql;
create table not_in_HDD_4 as
select *,
case
when (start=dob) then "True"
else "False"
end as sql_case_var length=8
from not_in_HDD_3;
quit;
任何洞察都将不胜感激 SAS日期只是相对于1960年1月1日(即第0天)的数字。您可以使用任何标准类型的比较来比较它们。这里有一些方法可以做到这一点
data want;
set have;
dob = input(birth_date, anydtdte8.);
/* 1 and 0 indicator if they are equal/not equal */
result1 = (start = dob);
/* 1, 0, missing indicator: we are exploiting the fact
that adding a missing value produces a missing value.
Note that this is not the case with the sum() function */
if(start + dob = .) then call missing(result2);
else if(start = dob) then result2 = 1;
else result2 = 0;
/* select function */
select;
when(start = dob) result3 = 1;
when(start + dob = .) result3 = .;
otherwise result3 = 0;
end;
run;
这与您的问题无关,但您可以使用
coalesce
函数稍微清理代码,返回第一个非缺失值<代码>开始=合并(STMT\u期间\u开始,接受\u开始\u护理)。另外,我认为你的条件句没有任何问题。可以将数据集的一部分添加到您的问题中吗?谢谢!不幸的是,我无法添加此数据,它是敏感的:(你能添加日期/if_结果吗?嘿@J_Lard我创建的格式化日期变量有点奇怪。我使用了你与我的未格式化变量和ifn函数的联合,它工作起来很有魅力。SAS日期总是吸引我!制作看起来像真实数据的假数据。感谢Stu提供的详细信息!我尝试了你的方法a。)nd在我格式化的日期变量上并没有成功。然而,当我用你们的方法处理一个原始变量和一个我创建的变量时(start=birth\u date),它成功了。我想知道日期变量的格式是否有问题???是的,有def。日期的格式有点奇怪。这非常有效-数据不在HDD中;设置不在中_HDD 2;开始=合并(STMT_PERIOD_FROM,ADMIT_start_OF_CARE);出生日期;出生记录=ifn(开始等式dob,0,1);ifc_result=ifc(开始=dob,“True”,“False”,“Missing”);ifn_result=ifn(开始=dob,1,0,);ifn_result\u fmt=put(ifn_result,ifn_标签);fuzz_result=ifc(开始等式dob),“True”,“False”,“Missing”;drop ifn_result;run;