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 上填写问题请求此类功能。
我试图在查询中使用参数,但我(或我的系统)似乎有日期问题。
我正在连接到 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 上填写问题请求此类功能。