R - 使用“”将日期/时间变量推送到SQL查询

时间:2014-06-30 14:24:30

标签: mysql r datetime

我试图将动态变量推送到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)

1 个答案:

答案 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)