我试图在查询中使用参数,但我(或我的系统)似乎有日期问题。
我已连接到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崩溃,查询时间太长。
赞赏任何提示
答案 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')
不起作用?class
属性设置为&#39;日期&#39;和print.Date()
函数将它们显示为日期而不是数字。 现在因为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()
。