我试图将动态变量推送到R中的sql查询,以便查询在24小时内递增24次并将每个结果集写入csv。不幸的是我收到了这个错误:
Error in mysqlExecStatement(conn, statement, ...) :
RS-DBI driver: (could not run statement: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'set @d2 = 2014-06-01 01:00:00 ;
我尝试使用as.character来强制我的日期/时间,以为我的日期/时间变量将被传递为" xx-xx-xxxx xx:xx:xx"但不幸的是,每次运行该函数时,它都会删除查询中的引号和错误。有没有办法将对象传递给R中的sql查询,可以在MySQL中将其视为日期/时间?
相关代码如下:
timeseq <- timeSequence(from = "2014-06-01", to ="2014-06-02", by = "hour")
for (i in 1:length(timeseq)){
if(i<length(timeseq)){
i2 <- i+1
}
date1 <- timeseq[i,]
date2 <- timeseq[i2,]
date1 <- as.character(date1)
date2 <- as.character(date2)
sqlcmd <- paste("set @d1 = ", date1, ";
set @d2 = ",date2,";
select
...")
test <- dbGetQuery(MySQLcon, sqlcmd)
答案 0 :(得分:0)
我自己想出来了,但是从Konvas的建议开始。单独使用单个刻度标记不起作用,因为R只是将我的变量名称作为查询中的字符串读取。相反,我不得不把&#34;&#39;&#34; date1&#34;&#39;&#34;&#34;让它工作。
我还必须在我的陈述的顶部完全删除我定义的变量,R没有任何这些。幸运的是,这是一个简单的查询,我并不真正需要定义的变量。我的最终代码如下所示:
timeseq <- timeSequence(from = "2014-06-01", to ="2014-06-02", by = "hour")
for (i in 1:length(timeseq)){
if(i<length(timeseq)){
i2 <- i+1
}
date1 <- timeseq[i,]
date2 <- timeseq[i2,]
date1 <- as.character(date1)
date2 <- as.character(date2)
sqlcmd <- paste("
select
round(gps_data.latitude,2) latitude,
round(gps_data.longitude,2) longitude,
count(gps_data.id) n
from
gps_data,
pims,
fleets
where
fleets.id = pims.fleet_id and
fleets.id = 3 and
gps_data.pim_id = pims.id and
gps_data.created_at between '",date1,"'and '",date2,"'
group by 1,2")
test <- dbGetQuery(MySQLcon, sqlcmd)
write.csv(filename=date1,x=date1)