sqlSave:将数据帧时间戳映射到SQL Server时间戳
问题描述:
我正尝试使用sqlSave()将数据帧上载到sql server中的表。这个数据帧有一个时间戳,我想将timestamp col映射到sqlserver中的datetime col。sqlSave:将数据帧时间戳映射到SQL Server时间戳
我收到两个问题。
1.它将数据帧的时间戳映射到浮点数。 2.它创建一个表,但没有数据上传,我得到一个错误。
下面是一个例子的数据帧,中纤板:
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 Server数据库...
> 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
此外,当我看数据类型的表中,我没有得到时间戳的“日期时间”。对于我来说,为什么RODBC会将POSIXct时间戳映射到除日期时间以外的任何事物。
[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
我该如何解决这个问题?
答
两个选项:
1)懒人一个:让错误发生时,该表将被创建,更改列(S)在你的数据库中手动DATETIME。它会在下一次工作。
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)