使用 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)具有不获取您不使用的数据的额外优势。在示例中,仅提取列 ref
和 DE_DATE
,而如果使用 RODBC,则会提取所有列,然后丢弃未使用的列。
注意collect()
调用意味着您实际上是在获取数据,在此之前任何操作实际上都组成了一条 SQL 语句并且不获取数据。
【讨论】:
感谢您的建议和解释,这样可以更快地检索所有信息。我将不得不更频繁地开始使用 DBI!以上是关于使用 RODBC 将访问表导入 R 时保存日期/时间列的时间戳的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 RODBC 将 R 连接到 PostgreSQL 时出错
使用 rodbc 包从 R 查询 sql server。需要将日期/时间值作为 where 语句的一部分传递到 sqlQuery