RODBCExt:带日期的 sqlExecute 问题

RODBCExt: sqlExecute issue with dates

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

我正在连接到 MS SQL 服务器

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

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

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

sqlExecute(myconn,test, endDate)

这给出了以下错误

Error in sqlExecute(myconn, test, endDate) : 22018 0 [Microsoft][SQL Server Native Client 11.0]Invalid character value for cast specification

[RODBCext] Error: SQLExecute failed

In addition: Warning message: In sqlExecute(myconn, test, endDate) : 22018 0 [Microsoft][SQL Server Native Client 11.0]Invalid character value for cast specification

然后我尝试更改日期格式

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

但这会导致另一个错误

Error in sqlExecute(myconn, test, endDate) : 07006 0 [Microsoft][SQL Server Native Client 11.0]Restricted data type attribute violation

[RODBCext] Error: SQLBindParameter failed

In addition: Warning message: In sqlExecute(myconn, test, endDate) : 07006 0 [Microsoft][SQL Server Native Client 11.0]Restricted data type attribute violation

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

我也尝试过拥抱问号?通过引号作为“?”。 这导致 Rstudio 崩溃并且查询时间太长。

感谢任何提示

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

我花了很长时间试图找出如何使用 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

• cast dates using as.character(as.Date(column))

所以我试了一下:

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

天哪!它 有效 !!!

我希望这对某人有所帮助。我不知道这是否是针对不同 DBMS 的一致解决方案,但对于我的 DB2 连接,它工作得很好。

解决方案

日期必须以您的数据库 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 年 1 月 1 日以来的天数的数字向量,其中 class 属性设置为 'Date' 并且 print.Date() 函数将它们显示为日期而不是数字。
  • RODBCext 包只处理选定的 R 内部数据类型:integer, double (numeric) 和 character(以及所有其他 R 内部数据类型都转换为 character)。

现在因为 R 日期是内部数字(numeric 类型)传递给 ODBC 驱动程序的是你可以用 as.numeric(as.Date(yourDate)) 看到的,这显然不是就像 ODBC 驱动程序的日期。

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