使用 sqldf 保留时间 Class

Preserving times Class with sqldf

我正在使用 sqldf 连接多个表,但我无法在列上保留 times class 集和 chron 包。我对 sqldf 函数使用了 method="name__class" 参数,并用 class 适当地命名了我的列,但是我的 times 变量在 selection 之后没有保留 sqldf

是否可以 select times class 列并保留 class 或者我必须在 [= 之后重置 class 35=] select离子(这并不理想)。我提供了一个玩具示例,显示 sqldf 如何保留日期 classes,但不保留 times class:

 library(chron)
 mytime = data.frame(x=times(c("11:45:00", "12:15:00")))
 mytime$y = as.Date(c("2019-09-01", "2019-09-11"))
 mytime

         x          y
1 11:45:00 2019-09-01
2 12:15:00 2019-09-11
 class(mytime$x)
[1] "times"
 class(mytime$y)
[1] "Date"


 sqldf('select x as x__times, y as y__Date from mytime', method = "name__class")

    x__times         y
1 0.4895833 2019-09-01
2 0.5104167 2019-09-11

在此先感谢您的帮助。

sqldf 寻找 as.X 转换为 class X 但没有 as.times 所以它假设 times 不是class 和 x__times 是您要使用的实际名称。

要解决此问题,请定义 as.times:

as.times <- times

方法="auto"

此外,如果您添加 as.times 定义,则作为 @A。 Suliman 在评论中指出,在这种情况下您实际上不需要使用 name__class,因为默认值 method="auto" 已经自动将任何与输入列同名的输出列转换为该输入列的 class.

RH2

与 SQLite 不同,H2 数据库支持日期和时间 classes,因此如果您使用 H2 数据库后端 RH2,则无需定义 as.times

library(RH2)
library(sqldf)
sqldf("select x, y from mytime")

如果您想返回到 SQLite,请确保首先分离 RH2,因为除非您按照 ?sqldf 明确指定 SQLite,否则如果加载它,它将假设您需要它。

新一期

这已作为新问题添加https://github.com/ggrothendieck/sqldf/issues/36