2016-11-01 71 views
2

我想將當前年份以YY格式分配給宏或數據集變量。SAS:以YY格式獲取當前年份

我能夠使用自動宏變量&sysdate&sysdate9獲取當前日期。然而,以YY格式提取年份被證明是一場噩夢。以下是我一直在嘗試的一些例子。

存在YEARw.格式。但是當我嘗試使用它時,我會遇到錯誤或奇怪的結果。例如,運行

data _null_; 
    yy = year(input("&sysdate9.", year2.)); 
    put yy=; 
run; 

產生錯誤

ERROR 48-59: The informat YEAR was not found or could not be loaded. 

如果我嘗試在輸出變量的格式,我得到的1965年,而不是當前的年份。下面

data _null_; 
    yy = year(input("&sysdate9.", date9.)); 
    put yy= yy year2.; 
run; 

輸出

yy=2016 65 

請幫助。

回答

4

這個工程得到你是當年的2位數年份號碼:

DATA _NULL_; 

YEAR = PUT(TODAY(),YEAR2.); 
PUT YEAR; 

RUN; 
/* Returns: 16 */ 

要細數一下,我在這裏做什麼:

我用TODAY()來獲取當前日期作爲DATE類型。需要將&SASDATE轉換爲DATE,但也是SAS會話啓動的日期。 TODAY()是當前日期。

PUT允許我們傳遞非字符(數字/日期)值,這就是爲什麼它與TODAY()而不是INPUT一起使用。

+0

'PUT'是一個區別,當然,也可以嘗試用'SYSDATE'替換'TODAY()' - 你會看到另一個區別... – Nicarus

+0

感謝您的解釋! – Joe

0
  • 應用一年函數將日期變量
  • 轉換爲字符串
  • 取最後2個位數

編輯:修改輸入放

Year = substr(put(year(today()), 4.), 3); 
+0

這不適合我。當我運行'data _null_; Year = substr(input(year(today()),4),3); put年=; 運行;',我得到關於將數字轉換爲字符,然後年= =的說明。輸出。 –

+1

我覺得'substr(input('總是錯的'substr'是一個文本/字符函數,不應該直接應用於數字,在大多數情況下'input'會生成。 – Joe

2

我認爲值得在這裏更詳細地探討問題。

首先,格式是將數值轉換爲人類可讀格式的模式。這就是你想要在這裏做的:將日期值轉換爲可讀的格式,在這種情況下爲一年。

另一方面,信息將人類可讀信息轉換爲數字值。這不是你在這裏做的;你已經有了價值。

二,put與格式匹配,而input僅與信息匹配。

第三,您在最後一次嘗試時會接近:但您錯誤地使用了year格式。格式基本上是值映射,因此它們將其範圍內的每個可能的數值(有時「所有值」都是範圍,有時不是)映射到顯示值(字符串)。你需要知道輸入的期望值是多少。 YEARw.需要日期值作爲輸入,而不是年份值:意味着輸入是「從1/1/1960開始的天數」,映射到「年份」。因此,您無法將已經映射到年份值的值與該方法重新映射;它沒有任何意義。

讓我們來看看它:

data _null_; 
    yy = year(input("&sysdate9.", date9.)); 
    put yy= yy year2.; 
run; 

yy包含year函數的結果 - 2016年好爲止。現在,你需要2位數的年份(16);你可以通過mod功能,如果你喜歡,或把/ SUBSTR /輸入:

data _null_; 
    yy = input(substr(put(year(input("&sysdate9.", date9.)),4.),3,2),2.); 
    put yy=; 
run; 

mod是可能更容易但因爲它是一個數字。當然,你可能已經使用year

data _null_; 
    yy = put(input("&sysdate9.", date9.),year2.); 
    put yy=; 
run; 

現在,yy是性格,所以你可以換與input(...,2.)或者根據你的目的離開它的性格。

最後 - 使用說明&sysdate9.。您可以輕鬆地使這個日期沒有輸入:

"&sysdate9."d 

所以:

yy = put("&sysdate9."d,year2.); 

這就是所謂的字面日期(和"..."dt"..."t也爲日期時間的工作,時間)。他們需要標準SAS格式的東西才能正常工作。

正如Nicarus的回答指出的那樣,today()&sysdate9好一點,因爲它保證是今天的。如果您正在批量運行此程序或每天重新啓動會話,則這並不重要,但如果您有長時間運行的會話,則會這樣。

相關問題