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
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
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.
Ready to level-up your skills? Choose your own adventure.