【问题标题】:sqlSave: Mapping dataframe timestamps to SQL Server timestampssqlSave:将数据帧时间戳映射到 SQL Server 时间戳
【发布时间】:2012-01-21 12:20:26
【问题描述】:

我正在尝试使用 sqlSave() 将数据帧上传到 sql server 中的表。 此数据帧中有一个时间戳,我想将时间戳 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 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

我该如何解决这个问题?

【问题讨论】:

    标签: sql-server r dataframe rodbc


    【解决方案1】:

    两种选择:

    1)懒人:让错误发生,将创建表,并在数据库中手动将列更改为日期时间。下次就可以了。

    2) 正确:使用 varTypes

    请注意,您可以通过删除不必要的内容来解决您的问题。顺便说一句,我可能不会在 sql server 中使用列名 timestamp,因为我看到了混淆,因为内部时间戳数据类型完全不同。

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 2011-10-01
      • 2015-04-10
      • 2014-07-05
      相关资源
      最近更新 更多