如何使用 DBI 写入带有日期列的表

Posted

技术标签:

【中文标题】如何使用 DBI 写入带有日期列的表【英文标题】:How to write to table with date column with DBI 【发布时间】:2017-12-11 18:26:28 【问题描述】:

我正在尝试使用以下方法将数据框附加到 sql server 表中:

DBI::dbWriteTable(con_poc, "DEP_EVENTS", data_up, overwrite=FALSE, append = TRUE, verbose = TRUE, rownames = FALSE)

但我在数据库中的“日期”类型的列上遇到错误。

    Error in result_insert_dataframe(rs@ptr, values) : 
  nanodbc.cpp:1587: 22003: [Microsoft][ODBC SQL Server Driver]Numeric value out of range 

我之前使用 as.POSIXct(example_date) 格式化了该列,但这似乎只适用于“日期时间”列

谁能帮忙?

添加信息:

DEP_EVENTS:
DATA_REGION (varchar(50), not null)
EVENT_ID(PK, bigint, not null)
EVENT_NAME(varchar(200), not null)
FORECAST_STATUS(varchar(50), not null)
FORECAST_CYCLE(date, not null)

data_up <- data.frame(DATA_REGION = "America",
                      EVENT_NAME = "shiny deal",
                      FORECAST_STATUS = "Plan of Record",
                      FORECAST_CYCLE = as.Date("2017-07-07"))

DBI::dbWriteTable(con_poc, "DEP_EVENTS", data_up, overwrite=FALSE, append = TRUE, verbose = TRUE, rownames = FALSE)

Error in result_insert_dataframe(rs@ptr, values) : 
  nanodbc.cpp:1587: 22003: [Microsoft][ODBC SQL Server Driver]Numeric value out of range 

我没有插入主键,因为我尝试这样做时收到以下错误

Error in result_insert_dataframe(rs@ptr, values) : 
  nanodbc.cpp:1587: 23000: [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot insert explicit value for identity column in table 'DEP_EVENTS' when IDENTITY_INSERT is set to OFF. 

也应要求:

str(data_up)
'data.frame':   1 obs. of  4 variables:
 $ DATA_REGION    : Factor w/ 1 level "America": 1
 $ EVENT_NAME     : Factor w/ 1 level "shiny deal": 1
 $ FORECAST_STATUS: Factor w/ 1 level "Plan of Record": 1
 $ FORECAST_CYCLE : Date, format: "2017-07-07"

我也尝试将因子列更改为字符,但错误没有变化。

【问题讨论】:

您可以尝试使用format(example_date, format = "%Y-%m-%d") 格式化您的日期对象吗? 试过了,但它给出了同样的错误,它将列转换为字符类型? 我通常使用RODBCext 而不是DBI,并且在最近的版本之前需要将日期和日期时间转换为字符串。不知道DBI是不是类似。 你试过as.Date()吗? 我刚刚尝试使用odbcRSQLServer 包连接到SQL Server 发布的代码,在这两种情况下都可以正常工作。你用的是哪个包?哪个操作系统?哪个版本的 SQL Server? 【参考方案1】:

使用 RODBC,您可以通过在 sqlSave() 命令前面加上 SET IDENTITY_INSERT = ON 语句来插入主键列。例如:

con = odbcConnect(MY_DSN)
sqlQuery(con,'SET IDENTITY_INSERT DEP_EVENTS ON')
sqlSave(con, DEP_EVENTS, rownames = FALSE, append = 
        TRUE, verbose = FALSE, fast = FALSE)        
sqlQuery(con,'SET IDENTITY_INSERT DEP_EVENTS OFF')
close(con)

【讨论】:

以上是关于如何使用 DBI 写入带有日期列的表的主要内容,如果未能解决你的问题,请参考以下文章

使用 Datagrip 导入 csv(带有标识列的表)

如何在使用 Pandas.read_gbq 加载带有列表列的表后恢复结构?

如何使用另一个表中的日期列过滤一个表的开始和结束日期

如何使用基于日期列的预测

如何在带有 select 语句的 where 子句中使用比较运算符?

如何从包含日期时间列的表中获取某些行和“先前”行?