Hi
I'm experiencing weird SAS behavior:
data a;
/* uncomment for input to work in the next data step*/
/* length date1 $20; */
date1 = '2015-10-26T23:59';
date2 = '2015-10-26';
run;
data b;
set a;
not_related = trim(left(strip(date2)))||'T23:59';
dt = input(date1, e8601dt.);
run;
the second datastep produces a note that input has invalid argument. However, if in first datastep I set date1 length to $20, then the second step has no problem to run and input date/time.
Tested on SAS 9.3 TS Level 1M2 X64_ES08R2.
Anyone else seen this before?
Thanks
Its a known bug since SAS 9.2. What happening here is width of E8601DT must be 19 but the width
of value is only 16, so extra 3 characters are taken from the followed values.
Here in the example it is trying to take the values '201' as seconds i.e attempting to takes
values as ":ss". As 201 is not in the format as ":ss" it throwed an error as invalid argument.
This issue has been fixed in SAS 9.4
FYI: http://support.sas.com/kb/43/743.html
I don't get this, using 9.4:
299 data a;
300 /* uncomment for input to work in the next data step*/
301 /* length date1 $20; */
302 date1 = '2015-10-26T23:59';
303 date2 = '2015-10-26';
304 run;
NOTE: The data set WORK.A has 1 observations and 2 variables.
NOTE: DATA statement used (Total process time):
real time 0.01 seconds
cpu time 0.01 seconds
305
306 data b;
307 set a;
308 not_related = trim(left(strip(date2)))||'T23:59';
309 dt = input(date1, e8601dt.);
310 run;
NOTE: There were 1 observations read from the data set WORK.A.
NOTE: The data set WORK.B has 1 observations and 4 variables.
NOTE: DATA statement used (Total process time):
real time 0.04 seconds
cpu time 0.00 seconds
What does your log look like?
1 data a; 2 /* uncomment for input to work in the next data step*/ 3 /* length date1 $20; */ 4 date1 = '2015-10-26T23:59'; 5 date2 = '2015-10-26'; 6 run; NOTE: The data set WORK.A has 1 observations and 2 variables. NOTE: DATA statement used (Total process time): real time 0.01 seconds user cpu time 0.00 seconds system cpu time 0.01 seconds 7 8 data b; 9 set a; 10 dt = input(date1, e8601dt.); 11 run; NOTE: Invalid argument to function INPUT at line 10 column 10. date1=2015-10-26T23:59 date2=2015-10-26 dt=. _ERROR_=1 _N_=1 NOTE: Mathematical operations could not be performed at the following places. The results of the operations have been set to missing values. Each place is given by: (Number of times) at (Line):(Column). 1 at 10:10 NOTE: There were 1 observations read from the data set WORK.A. NOTE: The data set WORK.B has 1 observations and 3 variables. NOTE: DATA statement used (Total process time): real time 0.01 seconds user cpu time 0.00 seconds system cpu time 0.01 seconds
Well, I don't have 9.3 to hand and can't find a page on changes, but it may be that in 9.4 they relaxed the requirements on the string. Does adding the seconds part change this, I remember I always used to have to add ":00" to the end to get the format to work for me.
I think it's a SAS 9.3 bug. Adding seconds ':00' works the same way as increasing date1 length to $19 - input is performed correctly (as expected). Must be some kind of memory optimisation bug - because changing value of date2 to '2' also lets to input date1 without an error.
Just noticed, that if I initialize date2 before date1, the input works as expected.
Thanks
When I read the documentation for E8601dt informat is says default length is 19 and minimum length is 19, ie. E8601dt19. max length 26.
When you use
date1 = '2015-10-26T23:59'
the length of date1 is 16, which is too short generating the error.
This doesn't generate the error.
data a; /* uncomment for input to work in the next data step*/ /* length date1 $20; */ date1 = '2015-10-26T23:59:00'; date2 = '2015-10-26'; run; data b; set a; not_related = trim(left(strip(date2)))||'T23:59'; dt = input(date1, e8601dt.); run;
Neither does:
data a;
/* uncomment for input to work in the next data step*/
/* length date1 $20; */
date1 = '2015-10-26T23:59 ';
date2 = '2015-10-26';
run;
data b;
set a;
not_related = trim(left(strip(date2)))||'T23:59';
dt = input(date1, e8601dt.);
run;
The Input and informat are apparently checking on the length propery of the variable not the number of assigned characters.
does not seem a consistent check: there's no problem to input a value from variable with length of $16 when the date2 is initialized first in the first data step.
This is definitely odd:
data a; length date1 date2 $ 16 ; date1 = '2015-10-26T23:59:00'; date2 = '2015-10-26T23:59'; run; data b; set a; dt1 = input(date1, e8601dt.); dt2 = input(date2, e8601dt.); run;
It may be time to contact Tech support as this particular bit might be an actual bug.
But I would suggest if possible sticking to declaring any variable like this with a length at least 19 and not relying on implied length assignments. Explicit lengths are better programming practice.
Its a known bug since SAS 9.2. What happening here is width of E8601DT must be 19 but the width
of value is only 16, so extra 3 characters are taken from the followed values.
Here in the example it is trying to take the values '201' as seconds i.e attempting to takes
values as ":ss". As 201 is not in the format as ":ss" it throwed an error as invalid argument.
This issue has been fixed in SAS 9.4
FYI: http://support.sas.com/kb/43/743.html
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.