2016-09-23 201 views
1

我將SAS數據集導出爲ex​​cel,然後將其導回到SAS,並且爲了驗證,執行proc比較以確保所有值都相同。不幸的是,日期在DATETIME20。在原始SAS數據集中,使用MMDDYY10。當我將日期值從excel恢復到SAS時。我可以忍受這一點,但價值比較結果顯示沒有值匹配,列出04/04/06在基地,04APR2006在比較。SAS Proc比較 - 日期格式不同

有沒有辦法使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中的操作。

回答

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中已經失去了時間的一部分。

+0

事實上,它可能是Excel沒有失去時間的一部分 - 有時你可以將它們作爲分數天,在那裏'dhms(datevar,0,0,0)'將恢復它們。 – Joe

+0

我不確定我是否覺得這個事實令人感到安慰或可怕。 – Tom

+0

呃,我認爲這只是其中一個「從Excel轉換而來並不理想」的東西。 :) – Joe

1

DATETIME20. vs MMDDYY10.不只是格式上的差異 - 這不會是一個問題。

這是基礎值的差異,因爲日期時間是自1/1/1960 00:00:00以來的秒數,而日期是自1/1/1960以來的天數。非常不同的nubmers(86400倍)。

你需要在導入時控制這個,很可能,或者事後轉換。您可以嘗試DBSASTYPE告訴Excel將其導入爲日期時間:

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")。

如果您想在事後進行轉換,請使用DATEPART將日期時間轉換爲日期,或使用newdtvar = DHMS(datevar,0,0,0)將日期轉換爲日期時間。

+0

不幸的是,我不能使用dbms = excel。這可能是由於excel爲32位,而SAS爲64位。正如你懷疑的那樣,dssastype然後不起作用。不過,我欣賞這些提示,並且現在正在繼續。 – DrWhat