2011-12-15 106 views
13

我正嘗試使用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 

我該如何解決這個問題?

回答

16

兩個選項:

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)