2011-12-15 51 views
13

Tôi đang cố tải lên khung dữ liệu vào bảng trong máy chủ sql bằng cách sử dụng sqlSave(). Biểu dữ liệu này có dấu thời gian trong đó và tôi muốn ánh xạ dấu thời gian col thành giá trị giờ cao điểm trong sqlserver.sqlSave: Ánh xạ dấu thời gian biểu dữ liệu vào dấu thời gian SQL Server

Tôi gặp phải hai vấn đề.

1. Nó ánh xạ dấu thời gian của khung dữ liệu vào phao. 2. Nó tạo bảng nhưng không có dữ liệu nào được tải lên và tôi gặp lỗi.

Dưới đây là một ví dụ khung dữ liệu, 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 

Đây là những gì sẽ xảy ra khi tôi cố gắng sqlSave đến một cơ sở dữ liệu 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 

Ngoài ra, khi tôi nhìn vào các kiểu dữ liệu của bảng, tôi không nhận được "datetime" cho dấu thời gian. Nó không có ý nghĩa với tôi tại sao RODBC sẽ ánh xạ một timetamp POSIXct cho bất cứ điều gì khác hơn là 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 

Làm cách nào để giải quyết vấn đề này?

Trả lời

16

Hai lựa chọn:

1) Lazy một: để cho các lỗi xảy ra, bảng sẽ được tạo ra, và thay đổi các cột (s) để DateTime bằng tay trong cơ sở dữ liệu của bạn. Nó sẽ làm việc trong thời gian tới.

2) Đúng: sử dụng varTypes

Lưu ý rằng vấn đề của bạn có thể bị tước xuống bằng cách xóa những thứ không cần thiết. Là một sang một bên, tôi có lẽ sẽ không sử dụng dấu thời gian tên cột trong một máy chủ sql, bởi vì tôi đã thấy nhầm lẫn vì kiểu dữ liệu dấu thời gian nội bộ là hoàn toàn khác nhau.

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) 
Các vấn đề liên quan