2016-06-06 1 views
0

Я пытаюсь выбрать строки с значением даты меньше значения. Кажется, он не работает, поскольку я получаю все значения даты, а не только те, которые меньше значения.R sqldf не является селективным в критериях диапазона дат

Вот структура ДФ:

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-05-18 выбираются.

Я пробовал несколько подходов, но получаю те же результаты.

Благодаря

+2

Я предполагаю, бэкенд который используется в SQLite, которая не имеет собственного типа даты (как это делает SQL Server). Возможно, вам понадобится быть более явным в вашем запросе - см. [Этот пост] (http://stackoverflow.com/questions/13091000/sqlite-compare-dates) для некоторых идей. – nrussell

+0

Не уверен в работе. Спасибо, что указали мне их, но я думаю, что мой вопрос нуждается в R-решении. – Jazzmine

+1

nrussell правильный. 'sqldf' по умолчанию использует' SQLite' на back-end. Решение R было бы чем-то вроде уникального (sawdf [sawdf $ actiondate Gregor

ответ

1

1) SQLite Предполагая, что вы используете SQLite бэкенд по умолчанию, SQLite не имеет типа дат, даты переносятся в SQLite как число дней с UNIX эпохи. То есть на стороне SQLite actiondate - столбец чисел. (Если x были переменными класса "Date", тогда as.numeric(x) дает числа (числа), которые передаются/передаются в SQLite.) Нам нужно сравнить эти числа с соответствующим числом, а не с символьной строкой. Это будет работать, поскольку она также конвертирует дату сравнения таким же образом (т.е. заменяет $date0 с 16939, который является количество дней с UNIX Epoch представлены к этой дате):

library(sqldf) 

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

Существует больше информации о дате обработка в sqldf с SQLite на домашней странице sqldf на 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) Хотя это немного неаккуратно, а не преобразовать дату сравнению с числовой можно преобразовать столбец actiondate характеру с использованием SQLite встроенной функции:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^