BookmarkSubscribeRSS Feed
Pinegulf
Calcite | Level 5

So I ran into an issue when writing SAS dates to MS SQL database. (original question @Stacoverflow: stackoverflow.com/questions/53781236) 

 

 

How to write SAS dates to Microsoft SQL Server 2016 Date data type in database? 

 

The version I'm running is: 

%put &sysvlong.;
  9.04.01M2P072314
%put &SYSVLONG4.;
  9.04.01M2P07232014

 

And SAS/ACCESS

 

 

I got SAS data with a sas date DataEndDay and I want to write that into a database. The following bit is in use (buffer is just to speed up the testing-failing) :

 

libname valu oledb provider=sqloledb schema="dbo" INSERTBUFF=100        properties=("User ID"="&username." Password="&pw."
                    "data source" = &database. 
                    "initial catalog"=&catalog.);

proc sql noprint;
 insert into valu.Data_upload_from_me(   <some_columns...>, 
   <more-columns...>
,DataEndDay)

select 
<some_columns_source...>,
<more-columns_source...>
,DataEndDay from work.SAS_data_to_publish ;quit;

Of course because SAS dates are numbers, direct writing is going to fail. What works is if I hard-code this as:

select 
<some_columns_source...>,
<more-columns_source...>
,'2018-12-12' 
from work.SAS_data_to_publish ;quit;

But If I convert the SAS date to string in SAS datasteps:

data SAS_data_to_publish ; 
    set SAS_data_to_publish ;     dataEndday0 = put(DataEndDay, yymmddd10.);     DataEndDay1 = quote(dataEndday0, "'") ;run;

and try to write either of these, I get conversion error:

ERROR: ICommand::Execute failed. : Conversion failed when converting date and/or time from character string.

When I select the string it looks pretty ok:

proc sql; select DataEndDay1 from SAS_data_to_publish; quit;

'2018-12-12'

previously I've managed to write dateTimes with similar trick, which works:

proc format;    picture sjm
    . = .    other='%Y-%0m-%0d %0H:%0M:%0S:000' (datatype=datetime)
;run;
data to_be_written; 
    set save.raw_data_to_be_written;    DataEndDay0 = put(dhms(DataEndDay,0,0,0), sjm. -L);run;

Anyone ran into similar issues? How could I write the dates? I could ask them to change the column to dateTime, maybe....

Thank you in advance.

Edit:

I managed to develop a work-around, which works but is ugly and -frankly- I don't like it. It so happens that my date is same for all rows, so I can assing it to macro variable and then use it in database writing.

data _NULL_; 
  set SAS_data_to_publish; 
  call symput('foobar', quote( put (DataEndDay , yymmddd10. -L), "'") ) ; 
run;

....
select 
  <some_columns_source...>,
  <more-columns_source...>
 ,&foobar.
from work.SAS_data_to_publish ;quit;

 

 

2 REPLIES 2
Ksharp
Super User

1) Does your variable 'DataEndDay' has format DATE9. ?

2)You could try make a new variable which is datetime variable.and insert it again.

 

new_date=dhms(DataEndDay,0,0,0);

format new_date datetime.;

Pinegulf
Calcite | Level 5

Tried with 

 

insert into ...

<stuff>

select ... 

,DataEndDay format=DATE9. informat=DATE9.

 

Did not work.

Edit: Besides DATA9. does not look like it would 'fit':

12DEC2018


 

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
Mastering the WHERE Clause in PROC SQL

SAS' Charu Shankar shares her PROC SQL expertise by showing you how to master the WHERE clause using real winter weather data.

Find more tutorials on the SAS Users YouTube channel.

Discussion stats
  • 2 replies
  • 2624 views
  • 0 likes
  • 2 in conversation