【发布时间】:2020-07-07 03:20:36
【问题描述】:
如何将 SAS 日期写入数据库中的 Microsoft SQL Server 2016 Date 数据类型?
我得到了 SAS 日期为 DataEndDay 的 SAS 数据,我想将其写入数据库。以下位正在使用中(缓冲区只是为了加速测试失败):
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;
当然,因为 SAS 日期是数字,所以直接写入会失败。如果我将其硬编码为:
select
<some_columns_source...>,
<more-columns_source...>
,'2018-12-12'
from work.SAS_data_to_publish
;quit;
但如果我在 SAS 数据步中将 SAS 日期转换为字符串:
data SAS_data_to_publish ;
set SAS_data_to_publish ;
dataEndday0 = put(DataEndDay, yymmddd10.);
DataEndDay1 = quote(dataEndday0, "'") ;
run;
并尝试编写其中任何一个,我得到转换错误:
错误:ICommand::Execute 失败。 : 从字符串转换日期和/或时间时转换失败。
当我选择字符串时,它看起来还不错:
proc sql; select DataEndDay1 from SAS_data_to_publish; quit;
'2018-12-12'
以前我已经设法用类似的技巧编写了 dateTimes,这很有效:
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;
有人遇到过类似的问题吗?我怎么能写日期? 我可以要求他们将列更改为 dateTime,也许....
提前谢谢你。
编辑:
我设法开发了一种变通方法,它有效但很丑陋,而且 - 坦率地说 - 我不喜欢它。碰巧我的日期对于所有行都是相同的,所以我可以将它分配给宏变量,然后在数据库写入中使用它。
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;
当然,如果DataEndDay 发生变化,这将立即失败,但可能表明Proc SQLs 选择子句中有一些问题......
Edit Edit将问题粘贴到SAS forums
【问题讨论】:
-
这可能与分配给您尝试编写的变量的格式有关。特别是当您明确使用
put语句格式化要写入的值时,它工作正常。 Proc SQL 习惯于在处理值之前将格式应用于值(例如将值保存到宏变量)。失败时为您的日期变量分配什么格式?如果将其更改为yymmdd10.的格式,然后尝试运行插入代码会怎样? -
@RobertPenridge 尝试更改格式但没有效果。甚至特别是在 select 子句中:
select ... DataEndDay format=yymmdd10. informat=yymmdd10.,没有做到这一点。我开始认为这可能是一个实际的错误。