RODBCExt:带有日期的sqlExecute问题

时间:2015-08-12 20:53:46

标签: sql-server r rodbc

我试图在查询中使用参数,但我(或我的系统)似乎有日期问题。

我已连接到MS SQL Server

并定义我想要处理的特定日期

endDate <- '02.08.2015' 我的查询如下:

test <-"SELECT [RDate],[Currency_ID],[Rate],[NRate] 
FROM [dwh].[dbo].FC_CurrencyRate] 
WHERE RDate = ? " 

sqlExecute(myconn,test, endDate)

这会出现以下错误

  

sqlExecute(myconn,test,endDate)出错:    22018 0 [Microsoft] [SQL Server Native Client 11.0]转换规范的字符值无效

     

[RODBCext]错误:SQLExecute失败

     

另外:警告信息:   在sqlExecute(myconn,test,endDate)中:    22018 0 [Microsoft] [SQL Server Native Client 11.0]转换规范的字符值无效

然后我尝试更改dateformat

endDate <- as.Date(endDate, format='%d.%m.%Y')
sqlExecute(myconn,test, endDate)

但这导致了另一个错误

  

sqlExecute(myconn,test,endDate)出错:    07006 0 [Microsoft] [SQL Server Native Client 11.0]受限制的数据类型属性违规

     

[RODBCext]错误:SQLBindParameter失败

     

另外:警告信息:   在sqlExecute(myconn,test,endDate)中:   07006 0 [Microsoft] [SQL Server Native Client 11.0]受限制的数据类型属性违规

这是一个典型的问题吗?是否有其他类型的日期格式使用R?

我还尝试过拥抱问号?引用为'?'。 这导致Rstudio崩溃,查询时间太长。

赞赏任何提示

3 个答案:

答案 0 :(得分:3)

我花了很多时间试图找出如何使用R中的sqlExecute作为参数将日期传递到我的DB2数据库。我无法在任何地方找到简明的答案而且我得到了这种类型的输出:

> sql
[1] "select date from date where date = ?"
> sqlExecute(conn, sql, data = as.Date("2015-01-01"))
Error in sqlExecute(conn, sql, data = as.Date("2015-01-01")) : 
  07006 -99999 [IBM][CLI Driver] CLI0102E  Invalid conversion. SQLSTATE=07006
[RODBCext] Error: SQLBindParameter failed

通过RODBCext文档阅读我偶然发现Zozlak Source

  

•使用as.character(as.Date(column))

投射日期

所以我试了一下:

> sqlExecute(conn, sql, data = as.character(as.Date("2015-01-01")), fetch = T)
        DATE
1 2015-01-01

OMG!它工作 !!!

我希望这有助于某人。我不知道这是否是针对不同DBMS的一致解决方案,但对于我的DB2连接,它可以正常工作。

答案 1 :(得分:2)

解决方案

日期必须以数据库ODBC驱动程序接受的格式传递。应始终支持By definition YYYY-MM-DD 根据您的ODBC驱动程序,也可能(或可能不)支持其他日期格式。

默认情况下,R根据ISO 8601打印Date个对象,也是YYYY-MM-DD
as.character(as.Date(yourDate, format='see_as.Date_documentation'))应该可以胜任。

为什么as.Date(myDate, format='myFormat')不起作用?

  • R没有日期的单独内部数据类型。灵魂深处R日期是存储自1970-01-01以来的天数的数字向量,class属性设置为&#39;日期&#39;和print.Date()函数将它们显示为日期而不是数字。
  • RODBCext包仅处理选定的R内部数据类型:整数 double 数字)和字符 (以及所有其他R内部数据类型都转换为字符)。

现在因为R日期是内部数字(类型为 numeric ),所以传递给ODBC驱动程序的内容是as.numeric(as.Date(yourDate))所能看到的,它看起来不像是日期ODBC驱动程序。

当然你可以说日期是如此常用,以至于RODBCext应该处理R Date对象。在这种情况下,请在https://github.com/zozlak/RODBCext/issues上填写请求此类功能的问题。

答案 2 :(得分:0)

我没有R语言的经验,但我最好的猜测是它可能无法从datetime类型转换为SQL datetime类型。您可以尝试使用as.POSIXct功能将其转换为series.append()