我想通过带有绑定参数的 ROracle 查询发送到 oracle,这些参数包含日期列的日期范围。
我尝试运行:
idsample <- 123
strdate <- "TO_DATE('01/02/2017','DD/MM/YYYY')"
enddate <- "TO_DATE('01/05/2017','DD/MM/YYYY')"
res <- dbGetQuery(myconn,"SELECT * FROM MYTABLE WHERE MYID = :1 AND MYDATE BETWEEN :2 AND :3", data=data.frame(MYID =idsample , MYDATE=c(strdate,enddate )))
但我得到错误:
"绑定数据与绑定规范不匹配"
我找不到涵盖使用多个位置参数的文档,但是如果一个参数对应于数据框的单个列,那么按照这个逻辑,三个参数应该对应于三列:
idsample <- 123
strdate <- "TO_DATE('01/02/2017', 'DD/MM/YYYY')"
enddate <- "TO_DATE('01/05/2017', 'DD/MM/YYYY')"
res <- dbGetQuery(myconn,
paste0("SELECT * FROM MYTABLE WHERE MYID = :1 AND ",
"MYDATE BETWEEN TO_DATE(:2, 'DD/MM/YYYY') AND TO_DATE(:3, 'DD/MM/YYYY')"),
data=data.frame(idsample, strdate, enddate))
请注意,从 API 的角度来看,strdate
和enddate
没有什么特别之处,因此它们应该作为向量传递。
编辑:
将TO_DATE
作为参数的问题在于,它最终可能会作为字符串进行转义。 换句话说,使用我的第一个方法,您最终会在WHERE
子句中得到以下内容:
WHERE MYDATE BETWEEN
'TO_DATE('01/02/2017','DD/MM/YYYY')' AND 'TO_DATE('01/05/2017','DD/MM/YYYY')'
换句话说,TO_DATE
函数调用最终是一个字符串。 而是仅绑定日期字符串。