首页 > 解决方案 > SAS比较两个日期

问题描述

我有一个 sas 文件,看起来像

date1       date2       date3       comp

20201208    20110201    20120201  
20201208    20200101    20210201

所有日期都是数字,格式为 yymmddn8。comp 是文本类型。

现在我想用 1 或 0 填充 comp

if date2 < date1 < date3 then comp=1; else comp=0;

t work. I always get 即使条件为真,它也不会 1`。

节目(来自评论)

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"; 

谢谢

标签: datesascompare

解决方案


如果您打算使用日期 - 您应该学习如何使用 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 日期。所以更大的问题是当你将它与tday是 SAS 日期的变量进行比较时。

看看下面的这个 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;

推荐阅读