【发布时间】:2018-04-17 06:48:58
【问题描述】:
我正在尝试使用 dbSendQuery 编写准备好的语句。我的问题是输入的数据框被转换为数值,但是三个输入中的两个是日期。这会导致以下错误消息:
警告:postgresqlExecStatement 中的错误:RS-DBI 驱动程序:(无法检索结果:错误:类型时间戳的无效输入语法:“17624” )
我的代码如下:
query = dbSendQuery(con,"
SELECT
***AL LOT OF TABLE AND JOINS***
WHERE
users_terminals.user_user_id = $1 and
planning_stops.planned_arrival >= $2 and
planning_stops.planned_arrival <= $3"
,
data.frame(user$users_users_id,
datefrom,
dateto))
tmp = dbFetch(query)
dbClearResult(query)
datefrom 的数值是 17624,所以这让我觉得在我运行命令时 $2 被 as.numeric(datefrom) 替换了。另外, user$users_users_id 是一个数值,我没有得到那个错误。可能整个数据框都被转换为数字。
我创建了一个解决方法,但这不是最佳情况,我想了解这里发生的情况。我创建的解决方法是:
query = dbSendQuery(con,"
SELECT
***AL LOT OF TABLE AND JOINS***
WHERE
users_terminals.user_user_id = $1 and
EXTRACT(day from planning_stops.planned_arrival - '1970-01-01') >= $2 and
EXTRACT(day from planning_stops.planned_arrival - '1970-01-01') <= $3"
,
data.frame(user$users_users_id,
datefrom,
dateto))
tmp = dbFetch(query)
dbClearResult(query)
有人可以帮我吗?解决方法目前有效,但似乎不是最佳的。
谢谢。
更新
我已经阅读了一些关于 sqlInterpolate 的内容,所以我想让我们试一试。但是,我仍然收到一条错误消息:
postgresqlExecStatement(conn, statement, ...) 中的错误: RS-DBI 驱动程序:(无法检索结果:错误:运算符不存在:没有时区的时间戳 >= 整数 第 57 行:...planning_stops.planned_arrival >= 2018-04... ^ 提示:没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。 )
我的代码现在是:
query = sqlInterpolate(con,"
SELECT
***AL LOT OF TABLE AND JOINS***
WHERE
users_terminals.user_user_id = ?id1 and
planning_stops.planned_arrival >= ?date1 and
planning_stops.planned_arrival <= ?date2"
,
id1 = user$users_users_id,
date1 = datefrom,
date2 = dateto)
tmp = dbGetQuery(con,
query)
仍然无法正常工作。似乎 sqlInterpolate 将输入转换为整数。
【问题讨论】:
-
您使用的是 RPostgeSQL 还是 RPostges?
-
我正在使用 RPostgeSQL
标签: r prepared-statement rpostgresql r-dbi