R-запрос в базе данных Oracle, где дата составляет x дней с сегодняшнего дня

Я подключился к базе данных oracle с помощью R, я могу выполнять запросы к нему, но у меня проблема с выполнением запросов в столбце даты. Я хочу получить строки, в которых определенный столбец даты (INLDATE) находится в диапазоне от сегодняшнего дня до 7 дней с настоящего момента.

Другие запросы, которые я выполнил с пакетом dplyr, например:

tbl(con, 'UNIT') %>% select(SEQ) %>% filter(SEQ > 203)

Это работает отлично, однако, когда я пробую что-то вроде

Today <- Sys.Date()

tbl(con, 'UNIT') %>% select(INLDATE) %>% filter(INLDATE > Today)

или даже

tbl(con, 'UNIT') %>% select(INLDATE) %>% filter(INLDATE > 2021-04-04)

он дает мне ошибки, которые ожидают ДАТУ, но интерпретируются как число или строка

Как правильно это сделать? Заранее спасибо!

введите описание изображения здесь


person BillyBouw    schedule 07.05.2021    source источник


Ответы (1)


(Это хорошо тестируется с SQL Server, у меня нет Oracle, но предпосылка та же.)

Ваша дата преобразуется в арифметическое выражение:

2021-04-04
# [1] 2013

Вы можете увидеть, как это решается в dbplyr конвейере, используя show_query():

tbl(con, "UNIT") %>%
  filter(INLDATE > 2021-05-07) %>%
  show_query()
# <SQL>
# SELECT *
# FROM "UNIT"
# WHERE ("INLDATE" > 2021.0 - 5.0 - 7.0)

Вам нужно либо "2021-05-06", либо as.Date("2021-05-06").

tbl(con, "UNIT") %>%
  filter(INLDATE > "2021-05-07") %>%
  show_query()
# <SQL>
# SELECT *
# FROM "UNIT"
# WHERE ("INLDATE" > '2021-05-07')

tbl(con, "UNIT") %>%
  filter(INLDATE > as.Date("2021-05-07")) %>%
  show_query()
# <SQL>
# SELECT *
# FROM "UNIT"
# WHERE ("INLDATE" > TRY_CAST('2021-05-07' AS DATE))

А чтобы сделать в диапазоне от сегодняшнего дня до 7 дней назад, вы можете использовать between:

tbl(con, "UNIT") %>%
  filter(between(INLDATE, "2021-04-04", "2021-04-11")) %>%
  show_query()
<SQL>
SELECT *
FROM "UNIT"
WHERE ("INLDATE" BETWEEN '2021-04-04' AND '2021-04-11')
person r2evans    schedule 07.05.2021
comment
Спасибо за ответ, однако, когда я выполняю ваш запрос, я получаю следующую ошибку: Ошибка: nanodbc / nanodbc.cpp: 1655: HY000: [Oracle] [ODBC] [Ora] ORA-01861: литерал не соответствует строке формата ‹SQL› 'SELECT * FROM (UNIT) WHERE (INLDATE ›' 2021-05- 07 ') ВЫБРАТЬ ТОЛЬКО ПЕРВЫЕ 11 РЯДОВ' - person BillyBouw; 07.05.2021
comment
Да, я понятия не имею, как выглядит ваша схема, поэтому сложно сказать наверняка. Может быть, это поможет? stackoverflow.com/q/22542882/3358272 или stackoverflow.com/q/1387917/3358272 (все, что я сделал, это google _ 1_, я вообще не знаю Oracle. Можете ли вы опубликовать результат tbl(con, "UNIT") %>% select(INLDATE) %>% head(1) %>% collect() %>% dput()? - person r2evans; 07.05.2021
comment
tbl (con, UNIT)% ›% select (DELDATE)%›% head (1)% ›% collect ()%›% dput () structure (list (DELDATE = structure (1108425600, class = c (POSIXct, POSIXt) , tzone = UTC)), row.names = c (NA, -1L), class = c (tbl_df, tbl, data.frame)) - person BillyBouw; 07.05.2021
comment
Возможно, Oracle нужна полная временная метка, а не просто дата (я действительно не знаю). Попробуйте использовать "2021-04-11 00:00:00" или аналогичный. - person r2evans; 07.05.2021
comment
Кажется, что даты - это дата и время (‹dttm›), когда я печатаю их в консоли, когда я пишу в таблицу в CSV, но это обычная дата. Для этого времени есть отдельный столбец, так что этого не должно быть, но я попробовал ваше предложение, но все равно безрезультатно :( - person BillyBouw; 07.05.2021
comment
Я не знаю, что еще я могу сделать. Некоторые мысли: (1) Узнайте, что Oracle думает о UNIT.INLDATE, о каком именно классе, это может помочь информировать о последующих действиях. (2) Большинство СУБД предоставляют возможность привести столбец в условное выражение, возможно TRY_DATE('2021-04-04'), узнайте, как это сделать. (3) Выполните необработанный SQL-запрос (используя DBI::dbGetQuery(con, "select ...") и посмотрите, сможете ли вы заставить его работать таким образом. Как только вы определите необходимый SQL, отследите его назад, чтобы увидеть, как заставить dbplyr говорить на этом конкретном диалекте (или просто переопределить это с sql. (DBI - моя сила, а не dbplyr, извините.) - person r2evans; 07.05.2021
comment
Большое спасибо, но где-то я получил ответ, фокус был tbl (con, UNIT)% ›% select (DELDATE)%›% filter (DELDATE ›= TO_DATE ('2020-12-09', 'YYYY- ММ-ДД ')) - person BillyBouw; 07.05.2021
comment
Да, это было включено в две ссылки, которые я упомянул во втором комментарии. Я рада, что они сработали на вас! - person r2evans; 07.05.2021