【问题标题】:ROracle bind range of datesROracle 绑定日期范围
【发布时间】:2018-04-11 08:43:15
【问题描述】:

我想通过带有绑定参数的 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 )))

但我得到错误:

“绑定数据与绑定规范不匹配”

【问题讨论】:

  • 不用喊
  • SQL 是一门响亮的语言:D

标签: r bind roracle


【解决方案1】:

我找不到涵盖使用多个位置参数的文档,但是如果一个参数对应于数据框的单列,那么按照这种逻辑,三个参数应该对应于三列:

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 的角度来看,strdateenddate 没有什么特别之处,因此它们应该作为向量传递。

编辑:

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 函数调用最终是一个字符串。相反,只绑定日期字符串。

【讨论】:

  • 我尝试了你的建议。现在我得到:“在需要数字的地方找到了一个非数字字符”
  • @oomm 在您对TO_DATE 的调用中的所有内容都加上单引号。让我知道这是否解决了所有问题。
  • 没有。对不起..我以前在我的代码中有它。只是在这个示例中它被省略了。我会在问题中解决它。查询没有绑定参数就可以正常工作
  • MYDATE 列是 Oracle 表中的日期类型吗?
  • 我这里没有用于测试的 Oracle 数据库。我可以请求您尝试以下查询:dbGetQuery(myconn, "SELECT * FROM MYTABLE WHERE MYDATE = :1", data=data.frame(strdate))
猜你喜欢
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 2021-12-18
  • 2014-01-07
  • 2017-12-20
  • 1970-01-01
  • 2015-12-11
相关资源
最近更新 更多