我有begin.date
和end.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, "'"
"))
答案 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 = ""))