2016-06-06 14 views
0

Ich versuche, Zeilen mit einem Datumswert auszuwählen, der kleiner als ein Wert ist. Es scheint nicht zu funktionieren, da ich alle Datumswerte bekomme, nicht nur die weniger als einen Wert.R sqldf ist in Datumsbereichskriterien nicht selektiv.

Hier ist die df Struktur:

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

Und hier einige Beispieldaten:

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

Und hier ist mein sql:

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

Und hier einige der Ergebnisse:

... 
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 

Wie Sie sehen können Daten nach 2016-05-18 werden ausgewählt.

Ich habe mehrere Ansätze ausprobiert, bekomme aber die gleichen Ergebnisse.

Dank

+2

ich das Backend bin zu raten, die verwendet wird, SQLite, die hat keinen nativen Datumstyp (wie SQL Server). Sie müssen möglicherweise expliziter in Ihrer Abfrage sein - sehen Sie [diesen Beitrag] (http://stackoverflow.com/questions/13091000/sqlite-compare-dates) für einige Ideen. – nrussell

+0

Nicht sicher über das Backend. Danke, dass Sie mich auf sie hingewiesen haben, aber ich denke, dass meine Frage eine R-Lösung benötigt. – Jazzmine

+1

nrussell ist korrekt. 'sqldf' verwendet' SQLite' standardmäßig im Backend. Eine R-Lösung wäre etwas wie "unique (sawdf [sawdf $ actiondate Gregor

Antwort

1

1) SQLite Sie werden mit der Back-End-Standard-SQLite Unter der Annahme, SQLite keinen Datumsart so die Daten wie die Anzahl der Tage seit der UNIX-Epoche übertragen SQLite. Das ist auf der SQLite Seite actiondate ist eine Spalte von Zahlen. (Wenn x eine "Date" Klasse R-Variable ist, dann gibt as.numeric(x) die Nummer (n) an, die an SQLite übertragen wird.) Wir müssen diese Zahlen mit einer geeigneten Zahl vergleichen, nicht mit einer Zeichenfolge. Dies würde arbeiten, wie es auch den Vergleich Zeitpunkt in der gleichen Art und Weise konvertiert (dh es $date0 mit 16939 ersetzt, die die Anzahl der Tage seit der UNIX-Epoche zu diesem Zeitpunkt dargestellt ist):

library(sqldf) 

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

Es gibt mehr Informationen über Datum Verarbeitung in sqldf mit SQLite auf der sqldf Homepage auf gitHub: https://github.com/ggrothendieck/sqldf

1a) Dies auch, da alle Daten auf die gleiche Art und Weise übertragen bekommen funktionieren würde:

library(sqldf) 

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

1b) Obwohl es ein bisschen chaotisch, anstatt den Vergleich Datum numerischen umwandeln könnte die actiondate Spalte Zeichen unter Verwendung einer SQLite gebautet Funktion konvertieren:

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

2) H2 abwechselnd die H2 verwenden Backend, das einen Datumstyp hat. In diesem Fall funktioniert der Code in der Frage. Installieren Sie RH2 (einschließlich H2) und stellen Sie sicher, dass Java auf Ihrem Computer installiert ist. Dann:

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

Hinweis: Der Eingang wir davon ausgegangen, in reproduzierbarer Form ist:

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

ich noch nicht kommentieren kann, aber @Gregor hat eine große Lösung.Wenn Sie gebunden sind, und bestimmt, obwohl SQL zu verwenden, können Sie zunächst das Datum in ein Zeichen umgewandelt werden (da SQLite kein Datum Typ haben):

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