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

问题描述:

我有一个begin.dateend.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, "'" 
     ")) 
+0

备注:请勿在日期/时间/时间戳类型中使用'BETWEEN'。由于它们是一个正面的连续范围类型,因此应该使用独占的上限(即' = TIMESTAMP(:beginDate,'00:00:00'AND administ_date

+0

好奇@JillSellum ...我看到你接受了与我的不同的答案,这是很好的。对于未来的读者,请告诉我,如果参数化查询我建议工作。不幸的是不能用'db2'或'RJDBC'测试。 – Parfait

paste功能默认情况下插入空格,将您的字符串转换成

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

而是使用paste0。或继续使用pastesep参数设置为空字符串:

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

没有工作。我得到一个错误。 '错误:在意想不到的符号: “和之间Administered_Date 和日期(Administered_Date) '”,begin.date, “'” 和“ >”, +月= “”) +' –

+0

抱歉,我不能帮帮我。有了这些事情,我总是发现将SQL语句存储在一个变量中非常有用。将变量输出到通常的SQL接口(适用于我的Microsoft SQL企业管理器)并查看它是否有效。这样,你就会知道你的问题是字符串翻译还是与R – lebelinoz

+0

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(),以免被阅读整数