为什么我的年龄计算包括DAY比较?

时间:2014-07-31 13:57:46

标签: sas

这是代码。我对它的作用的解释(以及它操作的数据集的一些上下文)在代码下面。

 If DOB ne . then do;                                                                                                                                      
        Tage=Floor(intck('month',DOB,SpecimenDate)-(Day(SpecimenDate)<Day(DOB)));                                                                              
        If TAge < 12 then Age=TAge/12;                                                                                                                         
     End;                                                                                                                                                      
     Else Age=Int(TAge/12);                                                                                                                                    

     If Age <= 0 then Age=.;                                                                                                                                   
     If Age >110 then Age=.;   

我对代码的理解是,如果DOB(出生日期)没有丢失,那么创建一个变量&#34; tage&#34;这是DOB和SpecimenDate的函数(即当个体提交粪便,血液或尿液标本用于实验室测试时)。基本上,我知道此代码试图在提交标本时计算一个人的年龄,但我不确定它是如何完成的,或者代码是否错误。

更具体地说,我们似乎正在寻找受试者出生日期和他们提交标本的日期减去标本日期或出生日期之间的月数?然后,无论哪个值最大但是&lt; =返回参数?我真正不理解的论点部分是

(Day(SpecimenDate)<Day(DOB)

(注意:我理解超出此特定行的代码,但包括建立上下文的所有代码)

1 个答案:

答案 0 :(得分:1)

这是计算日期中月份或年份差异的标准方法(因此我猜测为什么没有评论 - 这很常见)。直到最近,这是计算年龄或其他月/年间隔的最简单方法,您只想计算完成的间隔。

打破这个:

intck('month',DOB,SpecimenDate)返回DOB和SpecimenDate之间的月数,但需要注意的是“月数”实际上意味着“月份的1个数”。

如果SpecimenDate的月份小于DOB,则

Day(SpecimenDate)<Day(DOB)返回1(true)。因此,如果是收集标本的月份的第15个月,并且我的生日是(任何)月份的第23天,则为1。

这是因为intck('month','23JAN1994'd,'15MAR1994'd)在它们之间返回2而不是1,因为默认情况下intck如何工作。

发布9.2后,您现在可以使用intck中的“method”可选第四个选项,在没有额外代码的情况下本地工作。

intck('month',SpecimenDate,DOB,'c') - &gt;连续,所以返回1 intck('month',SpecimenDate,DOB,'d')(或遗漏) - &gt;离散,所以返回2

要直接计算年龄,您现在可以intck('year',SpecimenDate,DOB,'c'),虽然您的代码看起来想知道1岁以下婴儿的分数年龄,这在任何情况下都需要第二段代码。