我正在使用 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()
中的方法。
请问有人可以帮忙吗?
(最)正确的答案可能取决于您正在使用的数据库和 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 以确保正确解析字符值。这种方法应该适用于大多数数据库的大多数情况。