我有一个看起来像的sas文件
date1 date2 date3 comp
20201208 20110201 20120201
20201208 20200101 20210201
所有日期均为数字,格式为yymmddn8
。并且CCD_ 2是文本类型。
现在我想像一样用1或0填充comp
if date2 < date1 < date3 then comp=1; else comp=0;
但它不起作用。即使条件为真,我也总是得到1
。
Progam(来自评论(
data kl.kl_neukunde;
set kl.kl01;
format tday yymmddn8. ;
format date_nk yymmddn8. ;
format date_nk_12mon yymmddn8. ;
tday=today();
date_nk = put(input(erste_besuch, ddmmyy10.), yymmdd8.)*1;
date_nk_12mon = date_nk + 10000;
if date_nk='' then date_nk=0;
if date_nk_12mon='' then date_nk_12mon=0;
if date_nk < tday < date_nk_12mon then neukunde="1";
如果您要处理日期,您应该学习如何使用SAS日期,因为有很多很棒的功能可以帮助处理日期。你现在所做的是一种艰难的约会方式。了解日期的一篇好论文是:https://support.sas.com/resources/papers/proceedings/proceedings/sugi25/25/btu/25p058.pdf
对于您的特定SAS代码,您有两个问题。
一个问题是变量date_nk
。与put函数一起使用的格式缺少一个"n"。格式yymmdd8.
使用破折号分隔日期部分,因此当它乘以1以创建数字变量时,该值将丢失。这将创建一个不丢失的值:date_nk = put(input(erste_besuch, ddmmyy10.), yymmddn8.)*1;
然而,一旦像那样创建了date_nk
,它就是数字,但不是SAS日期。因此,更大的问题是,当你将其与作为SAS日期的tday
变量进行比较时。
看看下面的SAS代码是否有意义:
data want;
erste_besuch = '30-06-2020';
format tday yymmddn8. ;
format date_nk yymmddn8. ;
format date_nk_12mon yymmddn8. ;
*** THIS IS A SAS DATE ***;
tday=today();
*** THESE ARE NUMERIC BUT -NOT- SAS DATES - SO USING DATE FORMATS WITH THESE VARIABLES IS A PROBLEM ***;
*date_nk = put(input(erste_besuch, ddmmyy10.), yymmdd8.)*1;
*date_nk = put(input(erste_besuch, ddmmyy10.), yymmddn8.)*1;
*date_nk_12mon = date_nk + 10000;
*** THESE ARE SAS DATES ***;
date_nk = input(erste_besuch, ddmmyy10.);
date_nk_12mon = intnx('month', date_nk, 12, 'same');
*** IF DATE VARIABLES ARE MISSING, KEEP AS MISSING, DO NOT RESET TO ZERO ***;
*if date_nk='' then date_nk=0;
*if date_nk_12mon='' then date_nk_12mon=0;
*** NOW YOU HAVE 3 VARIABLES THAT ARE ALL SAS DATES AND CAN COMPARE THEM CORRECTLY ***;
if date_nk < tday < date_nk_12mon then neukunde="1";
run;
title 'NEW ATTEMPT';
proc print data=want;
run;
title2 'WITHOUT FORMATS';
proc print data=want;
format _all_;
run;