问题描述
我有一个访问数据库(/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,所以不确定我将如何查询以确保这些单元格中的所有信息都得到保存。我想导入包含日期和时间戳的列,其格式与数据库中的格式相同。
非常感谢您的帮助。
解决方法
既然您使用的是 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 语句并且不会获取数据。