在R中传递两个日期作为参数的SQL查询
我有一个begin.date
和end.date
,我想从这两个日期之间的db2表中检索行。在R中传递两个日期作为参数的SQL查询
当我通过硬编码这些值来运行查询时,它工作正常。
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, "'"
"))
的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 = ""))
没有工作。我得到一个错误。 '错误:在意想不到的符号: “和之间Administered_Date 和日期(Administered_Date) '”,begin.date, “'” 和“ >”, +月= “”) +' –
抱歉,我不能帮帮我。有了这些事情,我总是发现将SQL语句存储在一个变量中非常有用。将变量输出到通常的SQL接口(适用于我的Microsoft SQL企业管理器)并查看它是否有效。这样,你就会知道你的问题是字符串翻译还是与R – lebelinoz
Um更险恶,你不应该直接将参数串联到查询字符串中,因为它会邀请SQL注入。这里是否有限制,因为大概是日期是键入的(即不是任意字符串)?当然;但使用所有变量做它更好,并且它也可以解决问题(以及文本格式的任何潜在问题)。 –
只需使用参数化查询作为预处理语句上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()
,以免被阅读整数。
备注:请勿在日期/时间/时间戳类型中使用'BETWEEN'。由于它们是一个正面的连续范围类型,因此应该使用独占的上限(即' = TIMESTAMP(:beginDate,'00:00:00'AND administ_date
好奇@JillSellum ...我看到你接受了与我的不同的答案,这是很好的。对于未来的读者,请告诉我,如果参数化查询我建议工作。不幸的是不能用'db2'或'RJDBC'测试。 – Parfait