我之前运行过一个代码来查询 Teradata 服务器,但该服务器在更新 R 和所需的软件包后不再运行。
该问题似乎与 as.Date("X")
如何转换为 SQL 有关。
使用 show_query()
,在之前的版本中,它的形式为 CAST("X"AS DATE),现在为 SELECT DATE "X",在尝试提取数据时会引发错误。
我知道它与更新有关,因为代码仍然在运行旧版本并查询同一服务器的虚拟机上运行。
下面是两个查询的比较。
示例:
library (dplyr)
library (DBI)
library (odbc)
connection <- dbConnect(odbc(), "Teradata")
tbl(connection, "Teradata_table") %>%
head() %>%
select(POSIXct_POSIXt_var) %>%
mutate(date_var= as.Date(POSIXct_POSIXt_var)) %>%
show_query()
出现之前:
<SQL>
SELECT "POSIXct_POSIXt_var", CAST("POSIXct_POSIXt_var" AS DATE) AS "date_var"
FROM (
SELECT TOP 6 *
FROM "Teradata_table"
) "q01"
使用相同的代码现在会产生:
<SQL>
SELECT TOP 6 "POSIXct_POSIXt_var", DATE "POSIXct_POSIXt_var" AS "date_var"
FROM "Teradata_table"
后者的问题是,当尝试使用 as.data.frame()
或 as_tibble()
提取数据时,它会抛出错误。
tbl(connection, "Teradata_table") %>%
head() %>%
select(POSIXct_POSIXt_var) %>%
mutate(date_var = as.Date(POSIXct_POSIXt_var)) %>%
as_tibble()
(-3706)Syntax error: expected something between the word 'POSIXct_POSIXt_var' and the 'AS' keyword.
在提取数据之前,我需要进行大量数据过滤,但我一直坚持这一点,我想知道是否有其他人意识到这一点并有解决方案。我在网上找不到任何相关讨论。
版本更新自:
R 4.2 至 4.3 dplyr 1.0.10 至 1.1.2 dbplyr 2.2.1 至 2.3.2 odbc 1.3.3 至 1.3.4 DBI同1.1.3
最佳答案
如果您更喜欢CAST("X"AS DATE)
,那么您可以编写:
tbl(connection, "Teradata_table") %>%
head() %>%
select(POSIXct_POSIXt_var) %>%
mutate(date_var = sql('CAST("POSIXct_POSIXt_var" AS DATE)')) %>%
collect()
The problem with the latter is that it throws an error when trying to pull the data with as.data.frame() or as_tibble().
这可能只是因为在执行这些命令之一之前不会评估查询。使用 collect()
或 compute()
实现相同的效果(后者将数据保存在数据库中)。
关于r - 使用odbc/dbplyr时如何按日期+常量过滤?更新问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76282760/