R 包 DBI - 如何添加“WHERE date > 2022-01-01”子句?

问题描述 投票:0回答:1

我正在使用 R 包 DBI 从数据库中提取数据。我的查询如下所示:

extract <- dbGetQuery(con, 
'SELECT
"one column" as onecolumn,
"other column" as othercolumn,
"timestamp"
FROM table_in_the_db')

“时间戳”字段的格式为表格中的

"2021-02-16 13:26:08 UTC"
。我想添加一个子句“WHERE timestamp > 2022-01-01”。我问过 ChatGPT,它建议了 3 个“解决方案”,其中两个根本不影响提取:

WHERE date(timestamp) > 2022-01-01

timestamp::date
相同,还有一个根本不运行的解决方案,涉及

WHERE strftime('%Y-%m-%d', timestamp) > '2022-01-01'

这给出了找不到列“2022-01-01”的错误。

我知道DBI包的文档说它应该采用以下形式:

WHERE timestamp = ?', params = list()

但是我找不到将“时间戳> 2022-01-01”放入

list()
中的方法。

请问有人可以帮忙吗?

sql r dbi
1个回答
0
投票

(最)正确的答案可能取决于您正在使用的数据库和 R 库数据库驱动程序。

但是,一般来说,查询可以这样构造:

mydate <- '2022-01-01'

extract <- dbGetQuery(con, 
'SELECT
  "one column" as onecolumn,
  "other column" as othercolumn,
  "timestamp"
FROM table_in_the_db
where timestamp::date > $1::date',
params=list(as.character(mydate)))

我已将 mydate 转换为参数列表中的字符(在本示例中它是多余的,因为它被定义为字符串)。在某些情况下,如果该类是 Date 对象,则它可能会作为参考日期的整数值传递到数据库,并可能导致问题(取决于数据库和驱动程序)。同样,我将查询参数 $1 转换为 ::date 以确保正确解析字符值。这种方法应该适用于大多数数据库的大多数情况。

© www.soinside.com 2019 - 2024. All rights reserved.