I am referencing to a previous article in this link.
I'm trying to extract the modification datetime by using the Linux command stat. Then, I convert it into ISO8601 format which then I convert it into SAS datetime value. However, it does not appear to be working properly for me.
The stat command is issued as stat -c '%n %y' *.
The result is returned as:
copy_other_v2.sas 2019-05-17 10:42:28.697604000 -0400
copy_pgms_driver_21_cer.sas 2019-05-17 10:13:07.435587000 -0400
So, it's got blanks and missing the 'T' in the above DT string. For the filename 'copy_other_v2.sas', I recoded them by adding a 'T' before the datetime part and removed the blank in the timezone offset. So, the ISO8601 should look like this:
2019-05-17T10:42:28.697604000-0400
Right? Then, since the length is 34, I tried to convert that string into SAS DT value using the E8601DZ34.
/*
ersaces01:/aepp/users/reidc/copyjobs$ stat -c '%n %y' *
copy_other_v2.sas 2019-05-17 10:42:28.697604000 -0400
copy_pgms_driver_21_cer.sas 2019-05-17 10:13:07.435587000 -0400
*/
/* Documentation used for this test:
https://documentation.sas.com/?docsetId=leforinforref&docsetTarget=p1a0qt18rxydrkn1b0rtdfh2t8zs.htm&docsetVersion=9.4&locale=en
SAS Communities article referenced:
https://communities.sas.com/t5/General-SAS-Programming/Convert-ISO8601-string-to-datetime-format/m-p/421077#M52603
*/
data x;
/* Recode original DT value into IS08601 DT */
/* 2019-05-17 10:42:28.697604000 -0400 becomes */
/* 2019-05-17T10:42:28.697604000-0400 */
x = '2019-05-17T10:42:28.697604000-0400';
lenx = length(x);
put lenx=;
y = input(x, e8601dz34.);
put y=;
format y datetime20.;
run;
This is the error I kept getting:
241 /*
242 ersaces01:/aepp/users/reidc/copyjobs$ stat -c '%n %y' *
243
244 copy_other_v2.sas 2019-05-17 10:42:28.697604000 -0400
245 copy_pgms_driver_21_cer.sas 2019-05-17 10:13:07.435587000 -0400
246 */
247
248 /* Documentation used for this test:
249 https://documentation.sas.com/?docsetId=leforinforref&docsetTarget=p1a0qt18rxydrkn
249! 1b0rtdfh2t8zs.htm&docsetVersion=9.4&locale=en
250 SAS Communities article referenced:
251 https://communities.sas.com/t5/General-SAS-Programming/Convert-ISO8601-string-to-d
251! atetime-format/m-p/421077#M52603
252 */
253
254 data x;
255 /* Recode original DT value into IS08601 DT */
256 /* 2019-05-17 10:42:28.697604000 -0400 becomes */
257 /* 2019-05-17T10:42:28.697604000-0400 */
258 x = '2019-05-17T10:42:28.697604000-0400';
259
260 lenx = length(x);
261 put lenx=;
262
263 y = input(x, e8601dz34.);
264 put y=;
265
266 format y datetime20.;
267 run;
lenx=34
NOTE: Invalid argument to function INPUT at line 263 column 8.
y=.
x=2019-05-17T10:42:28.697604000-0400 lenx=34 y=. _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 263:8
NOTE: The data set WORK.X has 1 observations and 3 variables.
NOTE: DATA statement used (Total process time):
real time 0.02 seconds
cpu time 0.03 seconds
I expected the value of y to be in a numeric DT value formatted DATETIME20. Can someone help me with this issue?
Thank you.
Hello @CurtisER,
I think you just missed the colon in the offset: ...-04:00.
data x;
x = '2019-05-17T10:42:28.697604000-04:00';
y = input(x, e8601dz35.);
format y datetime20.;
run;
Hello @CurtisER,
I think you just missed the colon in the offset: ...-04:00.
data x;
x = '2019-05-17T10:42:28.697604000-04:00';
y = input(x, e8601dz35.);
format y datetime20.;
run;
@FreelanceReinh wrote:Hello @CurtisER,
I think you just missed the colon in the offset: ...-04:00.
data x; x = '2019-05-17T10:42:28.697604000-04:00'; y = input(x, e8601dz35.); format y datetime20.; run;
Why, yes, I believe I did miss the colon in the offset! Thanks for catching something this trivial, @FreelanceReinh.
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.