如何在R包DBI的查询中添加WHERE timestamp > '2022-01-01'条件?
解决DBI参数化查询筛选时间戳大于指定日期的问题
正确的参数化查询实现
直接在SQL的WHERE子句中保留比较运算符>,将日期值作为参数传入params列表即可,DBI会自动处理日期格式的转换,适配你的数据库类型:
# 定义筛选的起始日期(Date类型适配纯日期筛选) start_date <- as.Date("2022-01-01") # 执行参数化查询 extract <- dbGetQuery( con, 'SELECT "one column" as onecolumn, "other column" as othercolumn, "timestamp" FROM table_in_the_db WHERE timestamp > ?', params = list(start_date) )
如果需要匹配带时区的完整时间戳,可使用POSIXct类型:
start_datetime <- as.POSIXct("2022-01-01 00:00:00", tz = "UTC") extract <- dbGetQuery( con, 'SELECT "one column" as onecolumn, "other column" as othercolumn, "timestamp" FROM table_in_the_db WHERE timestamp > ?', params = list(start_datetime) )
你之前尝试方案的错误原因
WHERE date(timestamp) > 2022-01-01和WHERE timestamp::date > 2022-01-01:2022-01-01未加单引号,数据库会将其解析为数值计算(2022-1-1=2020),实际筛选的是日期大于2020年的记录,完全偏离预期。WHERE strftime('%Y-%m-%d', timestamp) > '2022-01-01':strftime是SQLite等特定数据库的函数,若你的数据库是PostgreSQL、MySQL等则不支持,直接报错;且该写法无法利用时间戳字段的索引,性能不如直接比较原生时间戳。
内容的提问来源于stack exchange,提问作者Reader 123
相关产品推荐
相关产品推荐

