SAS Proc Compare - 不同格式的日期

时间:2016-09-23 14:53:09

标签: sas compare

我正在将SAS数据集导出到Excel,然后将其导回SAS,并且为了验证,执行proc比较以确保所有值都相同。不幸的是,日期,在DATETIME20。在原始SAS数据集中,在MMDDYY10中。当我将日期值从excel带回SAS时。我可以忍受,但价值比较结果显示没有值匹配,在基数列出04/04/06,在比较中列出04APR2006。

有没有办法让proc比较忽略格式,或者专门检查是否有任何变量是MMDDYY10的方法。然后分配该变量DATETIME20。?

我对SAS没有经验,但这就是我想做的事 - 即。注释掉的位:

proc compare b = myBase c = myComp listvar warning;
* ignore date formats;
run;

proc import datafile = myExcelFile 
        out = myBase
        dbms = xls replace;
    guessingrows = 32767; 
    getnames = yes;
            * if anyVariable MMDDYY10. then thatVariable DATETIME20.;
    sheet = "mySheet";
run;

必须在SAS中进行验证 - 不要操纵excel。

2 个答案:

答案 0 :(得分:1)

SAS以秒为单位存储DATETIME值,以天为单位存储DATE值。 如果您确实只在那些DATETIME变量中存储日期然后进行比较,则需要将DATETIME值转换为DATE值。

data for_compare ;
  set myComp ;
  datevar = datepart(datevar);
  format datevar mmddyy10.;
run; 

proc compare b = myBase c = for_compare listvar warning;
run;

如果你真的真的存储了DATETIME值,那么为什么甚至懒得进行比较,因为它们不会匹配,因为Excel已经丢失了时间部分。

答案 1 :(得分:1)

DATETIME20. vs MMDDYY10.不仅仅是格式上的差异 - 这也不是问题。

这是基础价值的差异,因为日期时间是自1/1/1960 00:00:00以来的秒数,而日期是自1960年1月1日以来的天数。非常不同的nubmers(因子为86400)。

你可能需要在导入时控制它,或者在事后转换。您可以尝试DBSASTYPE告诉Excel将其导入为datetime:

proc import datafile = myExcelFile 
        out = myBase
        dbms = excel replace;
    getnames = yes;
    sheet = "mySheet";
    dbdsopts="dbsastype=(yourdatevar='datetime')";
run;

我认为你必须使用DBMS=EXCEL而不是XLS来使用dbdsopts,但不是100%肯定。您也可以使用USEDATE=NO选项,但我不确定是否会将日期从1/1/1900正确转换为1/1/1960(请参阅"Processing Date and Time Values in Microsoft Excel")。< / p>

如果您想在事后转换,请使用DATEPART将日期时间转换为日期,或使用newdtvar = DHMS(datevar,0,0,0)将日期转换为日期时间。