2013-02-18 3 views
1

Я ищу для преобразования даты, которая находится в формате CYYMMDD (где C - 0 для 20-го века или 1 для 21-го века) до стандартной даты SAS. Этот код будет помещен внутри запроса SAS с использованием «proc sql», чтобы он мог сравнивать дату 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

Во-первых, нет никакой необходимости, чтобы окружить имя переменной SAS с апострофы и 'n' классификатором; «Эффект» отлично. Какая переменная это (символ или число)? – BellevueBob

+0

Кавычки оставались в стороне от игры - это только так в этом заявлении. Переменная является числовой. Он находится в формате входных данных, перечисленных в «Пример» –

+0

Извините, что это так сложно, но что означают два LIBREFS «SOURCE» и «EGTASK»? Являются ли они разными соединениями DB2 или являются ли они библиотекой SAS? – BellevueBob

ответ

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; 

Это просто иллюстрация и немного длинный; он создает новую переменную SAS с именем SASEffectDate для сохранения исходной переменной. Когда вы используете его как переменную 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, это SQL через «proc sql», вытягивающийся из внешнего источника данных. –

+0

Наверное, я в замешательстве. Является ли 'EffectDate' столбцом в вашей таблице DB2 или является ли это переменной в наборе данных SAS? – BellevueBob

+0

EffectDate - это столбец в моей таблице DB2. –

Смежные вопросы