2013-02-18 60 views
1

我期待將格式爲CYYMMDD(其中C對於20世紀爲0或對於21世紀爲1)的日期轉換爲標準SAS日期。該代碼將放置在使用'proc sql'的SAS查詢中,以便它可以將SAS日期與存儲在DB2中的日期進行比較。將CYYMMDD轉換爲SAS DB2中的日期通過SAS

實施例:我試圖輸入數據= 1130101,輸出=「1Jan2013'd

實例是:

(substr(t1.'EffectDate'n,4,2)|| '/' || substr(t1.'EffectDate'n,6,2) || '/' || cast(substr(t1.'EffectDate'n,1,3) AS INTEGER) + 1900) 

失敗到鑄造()函數(顯示爲它不存在?)

也試過:

convert(varchar(10), convert(datetime, right(t1.'EffectDate'n, 6), 12), 101) 

但是VARCHAR(10)不存在。

我的查詢看起來是這樣的:

proc sql; 
create table CLAIMS as select 
      t1.CID, 
      t1.MID, 
      t1.DOS 
      OTHER_TABLE.ChangeDate AS EffectDate 
     FROM 
     SOURCE.REJECTED t1 
     INNER JOIN 
     EGTASK.OTHER_TABLE 
     ON 
     t1.DOS >= *Converted_Date* 
     [... goes on a couple more lines...] 

其中* Converted_Date *正是我需要的。

(不過,我要澄清,這個特定的查詢/加入並不一定需要SQL)

+0

首先,沒有必要包圍單引號和'N'預選賽SAS變量名; 'EffectDate'就好了。它是什麼類型的變量(字符或數字)? – BellevueBob 2013-02-18 00:39:49

+0

這些報價是從玩遊戲中剩餘的 - 這只是在那個聲明中。該變量是數字。它是格式爲「Example」中列出的輸入數據 – 2013-02-18 00:45:23

+0

對不起,這是如此複雜,但兩個LIBREFS「SOURCE」和「EGTASK」是指什麼?它們是不同的DB2連接還是一個SAS庫? – BellevueBob 2013-02-18 01:43:34

回答

2

要將變量轉換從它當前的編碼格式轉換成合適的SAS日期變量,你需要打開它轉換成字符串,然後使用INPUT函數讀取結果。例如:

data _null_; 
    do EffectDate = 1130101,0130101; 

    cEffectDate = put(EffectDate,z7.); 
    if substr(cEffectDate,1,1) = '0' 
     then SASEffectDate = input('19' || substr(cEffectDate,2),yymmdd8.); 
     else SASEffectDate = input('20' || substr(cEffectDate,2),yymmdd8.); 
    put EffectDate= 
    /SASEffectDate= 
    /; 
    end; 
    format SASEffectDate yymmdd10.; 
run; 

這只是一個插圖,有點冗長;它會創建一個名爲SASEffectDate的新SAS變量來保留原始變量。一旦你把它作爲一個SAS變量,你不需要做任何事情; SAS Access產品將知道如何創建對外部數據庫的引用。

下面是使用PROC SQL做類似的例子:

data have; /* Just a dummy data set for illustration */ 
    do EffectDate = 1130101,0130101; 
    i+1; 
    output; 
    end; 
run; 
proc sql; 
    create table want as 
    select t2.* 
     , case when t2.EffectDate < 999999 /* starts with 0 */ 
      then input('19' || substr(put(EffectDate,z7.),2),yymmdd8.) 
      else input('20' || substr(put(EffectDate,z7.),2),yymmdd8.) 
      end as SASEffectDate format=yymmdd10. 
    from have t2 
    ; 
quit; 
+0

有趣。整合到JOIN語句中(在ON標準中)究竟如何?此外,正在運行的代碼不是SAS,它是通過從外部數據源提取的「proc sql」執行的SQL。 – 2013-02-18 01:04:15

+0

我想我很困惑。 EffectDate是DB2表中的一列還是SAS數據集中的變量? – BellevueBob 2013-02-18 01:11:20

+0

EffectDate是我DB2表中的一列。 – 2013-02-18 01:14:08