Подтвердить что ты не робот

SqlSave: сопоставление временных меток данных с метками времени SQL Server

Я пытаюсь загрузить фрейм данных в таблицу на сервере sql с помощью sqlSave(). В этом фрейме данных есть временная метка, и я хотел бы сопоставить временную шкалу col с datetime col в sqlserver.

У меня возникают две проблемы.

1. Он сопоставляет временную метку фрейма данных с поплавком.   2.. Он создает таблицу, но данные не загружаются, и я получаю сообщение об ошибке.

Вот пример фрейма данных, mdf:

mdf <- structure(list(run = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("run_00", 
"run_01", "run_02", "run_03", "run_04"), class = "factor"), slot = structure(c(1L, 
1L, 1L, 1L, 1L, 1L), .Label = c("slot 3", "slot 4", "slot 5", 
"slot 6"), class = "factor"), timestamp = structure(c(1320774563, 
1320774624, 1320774686, 1320774747, 1320774809, 1320774871), class = c("POSIXct", 
"POSIXt"), tzone = ""), channel = structure(c(1L, 1L, 1L, 1L, 
1L, 1L), .Label = c("och01", "och02", "och09", "och10"), class = "factor"), 
    variable = structure(c(2L, 2L, 2L, 2L, 2L, 2L), .Label = c("num_blocks", 
    "num_collection", "num_corr_0", "num_corr_1", "num_uncorr_srow", 
    "post_fec_err_rate", "pre_fec_err_rate"), class = "factor"), 
    value = c(1, 62, 124, 185, 247, 309)), .Names = c("run", 
"slot", "timestamp", "channel", "variable", "value"), row.names = c(NA, 
6L), class = "data.frame")

> mdf
     run   slot           timestamp channel       variable value
1 run_00 slot 3 2011-11-08 12:49:23   och01 num_collection     1
2 run_00 slot 3 2011-11-08 12:50:24   och01 num_collection    62
3 run_00 slot 3 2011-11-08 12:51:26   och01 num_collection   124
4 run_00 slot 3 2011-11-08 12:52:27   och01 num_collection   185
5 run_00 slot 3 2011-11-08 12:53:29   och01 num_collection   247
6 run_00 slot 3 2011-11-08 12:54:31   och01 num_collection   309

Вот что происходит, когда я пытаюсь sqlSave для базы данных sql-сервера...

> sqlSave(dbandle,mdf,tablename="mdf")
Error in sqlSave(dbandle, mdf, tablename = "mdf") : 
  [RODBC] Failed exec in Update
22018 0 [Microsoft][ODBC SQL Server Driver]Invalid character value for cast specification

Кроме того, когда я смотрю на типы данных таблицы, я не получаю "datetime" для метки времени. Для меня не имеет смысла, почему RODBC будет отображать временную метку POSIXct для чего-либо, кроме datetime.

[rownames] [varchar](255) NULL,
[run] [varchar](255) NULL,
[slot] [varchar](255) NULL,
[timestamp] [float] NULL,
[channel] [varchar](255) NULL,
[variable] [varchar](255) NULL,
[value] [float] NULL

Как мне обойти это?

4b9b3361

Ответ 1

Два варианта:

1) Ленивый: пусть возникнет ошибка, таблица будет создана и изменит столбец на дату и время вручную в вашей базе данных. Он будет работать в следующий раз.

2) Правильно: используйте varTypes

Обратите внимание, что вашу проблему можно удалить, удалив ненужные вещи. Как и в стороне, я, вероятно, не буду использовать временную метку имени столбца на сервере sql, потому что я видел недоумения из-за того, что тип данных временной метки совершенно другой.

library(RODBC)
mdf = data.frame(timestamp=as.POSIXct(Sys.time()))

varTypes = c(timestamp="datetime")
channel = odbcConnect("test")
sqlSave(channel,mdf,rownames=FALSE,append=TRUE,varTypes=varTypes)
close(channel)