R — ввод переменной даты / времени в SQL-запрос с помощью » «

#mysql #r #datetime

#mysql #r #дата и время

Вопрос:

Я пытаюсь вставить динамическую переменную в sql-запрос в R, чтобы запрос увеличивался в 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», но, к сожалению, каждый раз, когда я запускаю функцию, она отбрасывает кавычки и выдает запрос с ошибками. Есть ли какой-либо способ передать объект в sql-запрос в R, который можно рассматривать как дату / время в 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. Я думаю, вам нужно добавить метки sigle (‘…’) вокруг дат?

2. Когда я это делаю, SQL считывает его просто как date1 и date2.

Ответ №1:

Я понял это самостоятельно, но начал с совета Конваса. Установка одиночных галочек сама по себе не работает, потому что R просто считывает имя моей переменной как строку в запросе. Вместо этого мне пришлось ввести «‘»date1″‘», чтобы заставить его работать.

Мне также пришлось полностью удалить мои определенные переменные в верхней части моего заявления, у 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)