使用 RODBC 将访问表导入 R 时保存日期/时间列的时间戳

Posted

技术标签:

【中文标题】使用 RODBC 将访问表导入 R 时保存日期/时间列的时间戳【英文标题】:Conserving timestamps for Date/Time column when importing access sheets into R using RODBC 【发布时间】: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 【参考方案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!

以上是关于使用 RODBC 将访问表导入 R 时保存日期/时间列的时间戳的主要内容,如果未能解决你的问题,请参考以下文章

RODBC sqlQuery as.is 返回错误结果

尝试使用 RODBC 将 R 连接到 PostgreSQL 时出错

使用 rodbc 包从 R 查询 sql server。需要将日期/时间值作为 where 语句的一部分传递到 sqlQuery

访问 ODBC 返回 1753 年之前的错误日期

通过 RODBC 包从 SQL 读取视图

使用 docker、rbase 和 RODBC 连接到 sql server 时出错