2016-06-06 20 views
0

我试图与日期值小于一个值,以选择行选择性的。由于我获取所有日期值,而不仅仅是那些小于值的值,所以它似乎并不工作。řsqldf不是在时间范围条件

这里的DF结构:

str(sawdf) 
'data.frame': 83597 obs. of 10 variables: 
$ actiondate  : Date, format: "2016-05-08" "2016-05-08" "2016-05-09" ... 

下面是一些样本数据:

head(sawdf) 
    actiondate 
2016-05-14 
2016-05-15 
2016-05-16 
2016-05-17 
2016-05-18 

这里是我的SQL:

sqldf("select distinct actiondate from sawdf where actiondate < '2016-05-18'") 

下面是一些结果:

... 
6 2016-05-13 
7 2016-05-14 
8 2016-05-15 
9 2016-05-16 
10 2016-05-17 
11 2016-05-18 
12 2016-05-19 

正如你可以看到超越2016年5月18日的数据被选中。

我试过几种方法,但得到的结果相同。

感谢

+2

我猜测后端被使用的是SQLite,它没有本机日期类型(如SQL Server所做的那样)。您可能需要在查询中更加明确 - 请参阅[本文](http://stackoverflow.com/questions/13091000/sqlite-compare-dates)了解一些想法。 – nrussell

+0

不确定后端。感谢指向我,但我认为我的问题需要一个R解决方案。 – Jazzmine

+1

nrussell是正确的。 'sqldf'在默认情况下在后端使用'SQLite'。 R解决方案就像'unique(sawdf [sawdf $ actiondate Gregor

回答

1

1)sqlite的假设你使用的是默认的SQLite后端,SQLite没有一个日期类型,这样的日期被转移到SQLite作为自Unix纪元的天数。这是在SQLite端actiondate是一列数字。 (如果x"Date" R类变量,那么as.numeric(x)会给出传送给SQLite的编号。)我们需要将这些编号与适当的编号进行比较,而不是将其与字符串进行比较。这工作,因为它也将转换以同样的方式比较日期(即它取代$date0与16939这是天的自Unix纪元在该日期所代表的号码):

library(sqldf) 

date0 <- as.Date("2016-05-18") 
fn$sqldf("select distinct actiondate from sawdf where actiondate < $date0") 

上有日期的更多信息处理sqldf与sqldf主页上的SQLite在GitHub上:https://github.com/ggrothendieck/sqldf

1A)这也将工作,因为所有的日期来获得同样的方式转移:

library(sqldf) 

Date0 <- data.frame(date0 = as.Date("2016-05-18")) 
sqldf("select distinct actiondate from sawdf where actiondate < (select date0 from Date0)") 

1b)的虽然有点混乱,而不是转换所述比较日期数字人们可以使用一个SQLite内建函数的actiondate列转换为字符:

sqldf("select distinct actiondate from sawdf 
     where strftime('%Y-%m-%d', actiondate * 3600 * 24, 'unixepoch') < '2016-05-18'") 

2)H2可替换地使用H2具有日期类型的后端。在这种情况下,问题中的代码确实有效。安装RH2(其中包括H2),并确保你的机器上安装了java。然后:

library(RH2) 
library(sqldf) 
sqldf("select distinct actiondate from sawdf where actiondate < '2016-05-18'") 

注:我们假定输入,可复制的形式是:

Lines <- "actiondate 
2016-05-14 
2016-05-15 
2016-05-16 
2016-05-17 
2016-05-18" 
sawdf <- read.csv(text = Lines) 
sawdf$actiondate <- as.Date(sawdf$actiondate) 
1

我不能评论还,但@Gregor有一个很好的解决方案。如果你被绑定并决定使用SQL,你可以先将日期转换成一个字符(因为SQLite没有日期类型):

sawdf <- data.frame(actiondate = as.Date(c("2016-05-14", "2016-05-15", "2016-05-30"))) 
sawdf$actiondate <- as.character(sawdf$actiondate) 
str(sawdf) 

sqldf("select actionDate 
    from sawdf where substr(actionDate,1,4)||substr(actionDate,6,2)||substr(actionDate,9,2) < '20160520'") 

    actiondate 
1 2016-05-14 
2 2016-05-15