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)
Я предполагаю, бэкенд который используется в SQLite, которая не имеет собственного типа даты (как это делает SQL Server). Возможно, вам понадобится быть более явным в вашем запросе - см. [Этот пост] (http://stackoverflow.com/questions/13091000/sqlite-compare-dates) для некоторых идей. – nrussell
Не уверен в работе. Спасибо, что указали мне их, но я думаю, что мой вопрос нуждается в R-решении. – Jazzmine
nrussell правильный. 'sqldf' по умолчанию использует' SQLite' на back-end. Решение R было бы чем-то вроде уникального (sawdf [sawdf $ actiondate
Gregor