R中的SQL查询将两个日期作为参数传递

时间:2017-10-21 19:48:33

标签: sql r db2

我有begin.dateend.date,我想在这两个日期之间从db2表中检索行。

当我通过硬编码这些值来运行查询时,它可以正常工作。

Data   =   dbGetQuery(conn, paste(
          "
          Select * From tableA
          WHERE DATE(Administered_Date) between '01-01-2011'  AND '01-31-2011' 
          "))

但是当我将这两个日期作为参数传递,而不是硬编码时,我会收到语法错误。这是我到目前为止的尝试。如果有人能告诉我哪里出错了,那将会很有帮助。提前谢谢。

 library(RJDBC)
 i <- '0'
 begin.date = as.Date("2011-01-01") + as.numeric(i) + as.numeric('0')
 end.date   = as.Date("2011-01-01") + as.numeric(i) + as.numeric('31')

     Data   =   dbGetQuery(conn, paste(
      "
      Select * From tableA
      WHERE DATE(Administered_Date) between '", begin.date,"'"  AND '", end.date, "'" 
      ")) 

2 个答案:

答案 0 :(得分:3)

只需使用RJDBC page中讨论的参数化查询来准备语句。除了SQL注入之外,您还可以从代码(SQL)中抽象数据(R)而不会出现混乱的字符串连接和引用封装,以增强可维护性和可读性:

SQLstring <- "SELECT * FROM tableA WHERE DATE(Administered_Date) BETWEEN ? AND ?"

Data <- dbGetQuery(conn, SQLstring, begin.date, end.date)

可能需要将日期强制转移到as.character()以避免被视为整数

答案 1 :(得分:1)

paste函数默认插入空格,将字符串转换为

Select * From tableA
      WHERE DATE(Administered_Date) between ' 01-01-2011 '  AND , ' 01-31-2011 '

而是使用paste0。或者继续使用paste并将sep参数设置为空字符串:

 Data   =   dbGetQuery(conn, paste(
      "
      Select * From tableA
      WHERE DATE(Administered_Date) between '", begin.date,"'"  AND , '", end.date, "'" 
      ",
      sep = ""))