SAS YYMMDD10. работает, но YYMMDDn10 нет - PullRequest
0 голосов
/ 18 февраля 2020

Это мои данные (извините за отсутствие сценария, это просто за c создание таблицы из мс sql):

testdb.testtable
id - numeric
date_from - numeric (datetime from mssql)
date_to - numeric (datetime from mssql)
base_id - numeric
base_id2 - string (length 64)

То, что я пытался сделать, было:

proc sql;
update testdb.testtable tt
set base_id2 = CATX('_',
    ('data from other table'),
    put(datepart(date_from),yymmddn10.),
    put(datepart(date_to),yymmddn10.),
    put(base_id,z4.)
)
where (....)
;
quit;

И я получаю эту ошибку:

The width value for YYMMDDN is out of bounds. It should be between 2 and 8.
The width value for YYMMDDN is out of bounds. It should be between 2 and 8.

Что я действительно не понимаю, так это то, что когда я использую формат с разделителями, YYMMDD10., Он работает.

Когда я запускаю:

proc sql;
select datepart(date_from) format=yymmddn10. from testdb.testtable;
quit;

Возвращает 20191227 - Отлично. Когда я запускаю

proc sql;
select put(datepart(date_from),yymmddn10.) from testdb.testtable;
quit;

Сбой с той же ошибкой.

Что мне не хватает?

Ответы [ 2 ]

3 голосов
/ 18 февраля 2020

Кажется, есть ошибка в PRO C SQL, которая позволяет вам прикрепить формат, который не может работать (максимальная ширина, необходимая для даты без разделителей, составляет 8 байт).

Интересно также, что PRO C PRINT (и простой запрос SELECT в PRO C SQL, как в вашем примере) не против того, что ширина формата недопустима.

542   data test1;
543     now=date();
544   run;

NOTE: The data set WORK.TEST1 has 1 observations and 1 variables.

545
546   data test2 ;
547     set test1;
548     format now yymmddn10.;
                   ----------
                   29
ERROR 29-185: Width specified for format YYMMDDN is invalid.

549   run;

NOTE: The SAS System stopped processing this step because of errors.
WARNING: The data set WORK.TEST2 may be incomplete.  When this step was stopped there were 0 observations
         and 1 variables.
WARNING: Data set WORK.TEST2 was not replaced because this step was stopped.

550
551   proc sql;
552   create table test2 as select now format=yymmddn10. from test1;
NOTE: Table WORK.TEST2 created, with 1 rows and 1 columns.

553   select * from test2;
554   quit;


555
556   proc print data=test2;
557   run;

NOTE: There were 1 observations read from the data set WORK.TEST2.

558
559   data test3;
560     set test2;
561   run;

ERROR: Width specified for format YYMMDDN is invalid.
NOTE: The SAS System stopped processing this step because of errors.
WARNING: The data set WORK.TEST3 may be incomplete.  When this step was stopped there were 0 observations
         and 1 variables.
WARNING: Data set WORK.TEST3 was not replaced because this step was stopped.

Также интересно то, что если вы используете эту спецификацию формата в PRO C FREQ

proc freq data=test2; tables now; run;

, она добавляет пробел и символ «F7» перед строкой данных.

The FREQ Procedure

                                       Cumulative    Cumulative
       now    Frequency     Percent     Frequency      Percent
---------------------------------------------------------------
 ÷20200218           1      100.00             1       100.00
1 голос
/ 18 февраля 2020

Число в формате соответствует заданной ширине. Формат YYMMDDn имеет 8 символов, поэтому я должен был использовать YYMMDDn8. И это сработало.

У меня была долгая борьба с этим, и я до сих пор не понимаю, почему это работает в формате =, а не в put ().

...