【问题标题】:Conserving timestamps for Date/Time column when importing access sheets into R using RODBC使用 RODBC 将访问表导入 R 时保存日期/时间列的时间戳
【发布时间】:2021-02-16 18:20:32
【问题描述】:

我有一个访问数据库(/access.mdb),其中一张(“潜水”)我正在尝试使用以下代码导入 R:

db <- odbcDriverConnect("Driver={Microsoft Access Driver (*.mdb, *.accdb)};
                        DBQ=D:/folder/access.mdb")

data <- as_tibble(sqlFetch(db, "dive", rownames=TRUE)) %>%
  select("ref", "DE_DATE") 

工作表可以很好地导入,但是“ds_date”列是数据库中的日期/时间对象,仅包含作为 POSIXct 对象的日期,而不是时间戳。在数据库中,它们以dd/mm/yyyy HH:MM:SS 的形式以空格分隔,如下所示,我认为这就是问题所在:

我查看了sqlFetch 函数,但看不到在阅读工作表时操作单个列的直接明显方法。我不太精通 SQL,所以不确定如何查询它以确保这些单元格中的所有信息都得到保存。我想导入包含日期和时间戳的列,格式与数据库中的相同。

非常感谢您的帮助。

【问题讨论】:

  • 您能否也展示一下您从sqlFetch 获得的结果是什么样的?您是否尝试过其他功能,例如dbReadTable

标签: sql r ms-access posixct rodbc


【解决方案1】:

既然您使用的是 dplyr/tidyverse,为什么不使用完整的 DBI/dbplyr?

library(DBI)
library(odbc)
library(dplyr)
library(dbplyr)

db <- dbConnect(odbc(), .connection_string = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:/folder/access.mdb")
data <- tbl(db, "dive") %>%
    select(ref, DE_DATE) %>%
    collect()

根据我的经验,DBI 倾向于更频繁地获取类型,并且使用 dbplyr(因为您已经在使用 dplyr)具有不获取您不使用的数据的额外优势。在示例中,仅提取列 refDE_DATE,而如果使用 RODBC,则会提取所有列,然后丢弃未使用的列。

注意collect() 调用意味着您实际上是在获取数据,在此之前任何操作实际上都组成了一条 SQL 语句并且不获取数据。

【讨论】:

  • 感谢您的建议和解释,这样可以更快地检索所有信息。我将不得不更频繁地开始使用 DBI!
猜你喜欢
  • 1970-01-01
  • 2019-06-29
  • 2020-07-06
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
相关资源
最近更新 更多