我正在尝试用dbSendQuery编写一个准备好的语句。我的问题是输入的数据框被转换为数值,但三个输入中的两个是日期。这会导致以下错误消息:
警告:postgresqlExecStatement中出错:RS-DBI驱动程序:(无法检索结果:错误:类型为timestamp的输入语法无效:“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)替换。用户$ 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驱动程序:(无法检索结果:ERROR:运算符不存在:没有时区的时间戳&gt; =整数 第57行:... planning_stops.planned_arrival&gt; = 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将输入转换为整数。
答案 0 :(得分:0)
只需将日期作为字符串传递,然后在查询中将其转换为DATE
:
query = sqlInterpolate(con,"SELECT ... WHERE
users_terminals.user_user_id = ?id1 AND
planning_stops.planned_arrival >= ?date1::DATE AND
planning_stops.planned_arrival <= ?date2::DATE"
,
id1 = user$users_users_id,
date1 = strftime(datefrom, "%Y-%m-%d"),
date2 = strftime(dateto, "%Y-%m-%d"))
tmp = dbGetQuery(con, query)
如果您想传递时间戳,只需在strftime()中使用适当的格式,然后在查询中转换为timestamp
。