R中的准备好的语句-dbSendQuery不适用于日期

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

我正在尝试使用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)  

有人可以在这里帮助我吗?该变通办法目前可以​​使用,但似乎并不是最佳选择。

谢谢。

UPDATE

我已经阅读了有关sqlInterpolate的内容,所以我想让我们尝试一下。但是,我仍然收到错误消息:

postgresqlExecStatement(conn,statement,...)中的错误:RS-DBI驱动程序:(无法检索结果:错误:运算符不存在:没有时区的时间戳> =整数LINE 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将输入转换为整数。

r prepared-statement rpostgresql r-dbi
1个回答
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

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