【问题标题】:RODBCExt: sqlExecute issue with datesRODBCExt:sqlExecute 日期问题
【发布时间】:2015-08-12 20:53:46
【问题描述】:

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

我正在连接到 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]强制转换规范的字符值无效

然后我尝试更改日期格式

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 崩溃,查询时间太长。

感谢任何提示

【问题讨论】:

    标签: sql-server r rodbc


    【解决方案1】:

    我花了很长时间试图弄清楚如何在 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
    

    天哪!它工作!!!

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

    【讨论】:

    • 感谢您提供的信息,我假设这也适用于我。明天上班试试。
    • 我可以确认它也适用于我 :) 非常感谢您分享您的信息
    • 使用 MSSQL 和 NZ 客户端/服务器语言环境对我不起作用
    【解决方案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 属性设置为“日期”,print.Date() 函数将它们显示为日期而不是数字。
    • RODBCext 包仅处理选定的 R 内部数据类型:integerdouble (numeric) 和 character (并且所有其他 R 内部数据类型都转换为 character)。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • posixct 也不起作用,如果我没记错的话,应该是错误 07006
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多