问题描述
我已使用 R 连接到 oracle 数据库,我可以对其执行查询,但在对日期列执行查询时遇到问题。我想获取某个日期列 (INLDATE) 介于今天和 7 天之后的行。
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)
它给我的错误是它需要一个 DATE 但它被解释为一个数字或一个字符串
这样做的正确方法是什么?提前致谢!
解决方法
(这个用 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')