2012-06-26 157 views
0

我想爲任意SAS日期添加1天。我有以下的代碼工作,但我不知道羯羊有內置的支持日期計算是這樣的:SAS中的日期計算

proc fcmp outlib=whatever; 
function lastDayInYear(d); 
    if datdif(d,mdy(12,31,year(d)),'ACT/365')=0 then return(1); else return(0); 
endsub; 

function advanceDate(d); 
    if d=. then return(.); 
    if lastDayInYear(d) then 
     return(mdy(1,1,year(d)+1)); 
    else 
     return(datejul(juldate7(d)+1)); 
endsub; 
quit; 

回答

7

Itzy是正確的...只需添加1,如果你想要做更高級的日期計算,你可以使用intnx()intck()功能。

例如

data _null_; 
    tomorrow   = date() + 1; 
    same_day_next_month = intnx('month',date(),1,'same'); 
    first_day_next_week = intnx('week' ,date(),1,'beginning'); 
    last_day_of_year = intnx('year' ,date(),0,'end'); 

    put _all_; 
run; 
9

日期只是數字,因此通過一個提前一天,你剛剛,呃,加1 。

你從哪裏找到該代碼?談論使用大錘破解螺母...

+0

雖然在SAS日期中添加和減去數字並且應該繼續在將來繼續工作,但它利用了SAS選擇了一個整數來表示它的內部事實。應該總是使用INTNX進行日期操作。在SAS決定改變它的可能性很小的情況下,如果你使用函數而不是數學運算,你的代碼將繼續工作。 –

+4

的確如此。 SAS也可能決定在300年內將其所有命令切換到Fino-Ugric,但我並不太擔心這一點。 – itzy

6

在SAS中,沒有DATE或DATETIME數據類型,這些值存儲爲通用數字數據類型,其中日期:存儲的數字表示日期之間的天數代表和1960年1月1日。對於日期時間它是相似的,只有秒數被存儲。你會在下面的代碼中看到它。 人類可讀的日期,時間和日期時間表示是通過SAS日期/時間格式實現的。 如需進一步解釋,只需在Web和文檔上搜索SAS日期即可。

回到你的問題:要添加一天到代表日期的值,只需做一個數學加法:+1。

data _null_; 
    length mydate mydatetime 8; 
    mydate='1jan1960'd; 
    mydatetime='1jan1960:00:00:00'dt; 
    nextdate = mydate + 1; 
    nextminute = mydatetime + 60; 
    put mydate 8. +4 mydate yymmdds10.; 
    put nextdate 8. +4 nextdate yymmdds10.; 
    put mydatetime 12. +4 mydatetime datetime.; 
    put nextminute 12. +4 nextminute datetime.; 
run;