2013-02-26 3 views
1

У меня есть время в R, которое я бы хотел написать в таблице MySQL в столбце DATETIME. Как я могу это сделать? Если я отформатирую его как строку, SQL не распознает его; если я использую as.POSIXlt SQL все еще не распознает его.Запись дат с помощью RMySQL

Я просто использую стандартные dbConnect и dbWriteTable заявления, которые работают с не-датами просто отлично.

+0

Временные переменные импортируются/экспортируются как символьные данные, поэтому вам необходимо преобразовать их в ваше любимое представление даты/времени. – agstudy

+0

@agstudy: Достаточно легко преобразовать символьные данные в даты в R. Но как мне обновить поле SQL DATETIME от R? Есть ли двоичный формат, который я могу использовать для переноса между ними? – Charles

ответ

4

По this:

MySQL распознает DATETIME и TIMESTAMP значения в этих форматах: Как строка в формате 'YYYY-MM-DD HH: MM: SS' или «YY-MM-DD HH : MM: SS 'формат.

Так одно решение для форматирования даты в нужном формате:

now <- as.POSIXlt(Sys.time()) 
now.str <- format(now,'%Y-%m-%d %H:%M:%S') 
now.str 
[1] "2013-02-26 04:12:24" 

или в этом формате

format(now,'%Y%m%d%H%M%S') 
[1] "20130226041224" 

Затем обновите свою таблицу с помощью dbSendQuery. Ниже приведен пример создания динамического запроса для любой таблицы и любой даты. Адаптируйте его к вашим потребностям.

table.Name <- "MY_TABLE" 
query <- paste(paste('UPDATE ', table.Name,sep=''), 
       paste('SET datetime_column =' ,"'",now.str,"'",sep=''), 
       'WHERE id=1',sep='\n') 

cat(query) 
UPDATE MY_TABLE 
SET datetime_column ='2013-02-26 04:12:24' 
WHERE id=1 

dbSendQuery(con, query) 

Я также думаю, что это должно работать с dbWritetable, как только вы форматировать даты в нужном формате. Но у меня нет MySQL для тестирования. Попробуйте и дайте мне знать, если это поможет.

+0

Он не работает с dbWriteTable, но может работать с dbSendQuery. Но если бы я это сделал, мне пришлось бы разбить мои заявления на одну запись за строку, верно? – Charles

+0

@Charles да, если у вас есть одна строка за строкой, вам нужно вызвать это для каждой строки. Конечно, количество обновленных строк зависит от вашего предложения Where. Я попытался бы зациклиться, и если он будет медленным, я бы изменил свой запрос sql, чтобы обновить несколько записей. (Вы можете задать новый вопрос, если вы не можете этого сделать, но он становится ясно sql-вопросом, что-то вроде [this] (http://stackoverflow.com/questions/5778140/update-multiple-records-in-sql) может помочь – agstudy

1

Я использую решение agstudy, а затем вызываю этот SQL после dbWriteTable, используя dbSendQuery. Кажется, хорошо работает.

ALTER TABLE TableName MODIFY DateFieldName datetime; 
Смежные вопросы