2014-02-25 44 views
1

我正在編寫一個SAS代碼,並且因爲我是SAS新手(一直在研究R),所以我無法理解SAS中的日期格式。如果SAS中的其他錯誤

我有一個SAS數據集Sales_yyyymm和我創建,需要一個日期值的用戶輸入一個代碼,如果存在該日期的銷售數據,我需要創建一個標誌爲1,否則爲0。目前我使用此代碼 - 在我的SAS數據

%Let check_date = 20010120; 

Data A; 
    Set B; 
If date=&check_date then Date_Flag = 1; 
else Date_Flag = 0; 
run; 

日期是日期列設置Sales_yyyymm和值都喜歡20130129,20110412,20140120等

但是,如果我運行這個代碼,我ge將我所有的Date_Flag值都設爲0. IF條件被忽略,我不確定這是怎麼發生的或爲什麼發生。

有什麼想法?

謝謝!

+1

整數I懷疑'date'列是INFACT其被格式化爲顯示爲YYYYMMDD即日期,日期不是8DIGIT整數。檢查'proc內容數據= <你的數據集>;運行;輸出並報告日期類型和格式列 – 2014-02-25 14:16:10

+0

另一件事 - 在SAS日期字面值應該是「DDMMMYYYY」d格式。如果實際上「日期」列確實存儲爲日期類型列,這將很重要。 – 2014-02-25 14:17:22

+0

我剛剛檢查並發現'date'列的類型是NUM和Len 4,格式是YYMMDDN8。 – RHelp

回答

3

您需要閱讀Understanding How SAS Handles Dates文章才能瞭解SAS如何在內部存儲日期以及如何計算日期,包括進行比較。

在SAS中,每個日期都是數字行上的唯一編號。 1960年1月1日的 之前的日期是負數;那些在1960年1月1日之後, 是積極的。因爲SAS日期值是數字變量,所以您可以輕鬆地對它們進行排序,確定時間間隔,並將日期作爲常量,作爲SAS函數中的參數或計算中的參數。

正如我在評論中提到的那樣,您確實需要在「ddmmmyyyy」d格式中指定日期文字。

%Let check_date = 20JAN2001; 

Data A; 
    Set B; 
If date="&check_date."d then Date_Flag = 1; 
else Date_Flag = 0; 
run; 

20010120翻譯成SAS日期超出有效範圍SAS可以處理:

所以,%Let check_date = 20010120;應該寫成。例如:2001012 - 注意最後沒有零,對應於​​- 是的,那是7438年!

鑑於14995是SAS所理解的可日期20JAN2001

+0

謝謝!這有幫助! :) – RHelp