在R中使用带有DATEADD条件的SQL查询时出错

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

我试图根据从R连接到SQL的日期条件提取数据。我的数据库连接来自Impala。

以下是我的示例代码。

dbGetQuery(src,"SELECT * FROM sample WHERE eventdate BETWEEN '2017-01-31' AND DATEADD(m,1,'2017-01-31')")

我在尝试查询时遇到错误。

Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ",  : 
Unable to retrieve JDBC result set for select * from sample where 
eventdate between '2017-01-31' and dateadd(m,1,'2017-01-31') ([Cloudera] 
[ImpalaJDBCDriver](500051) ERROR processing query/statement. Error Code: 0, 
SQL state: TStatus(statusCode:ERROR_STATUS, sqlState:HY000, 
errorMessage:AnalysisException: Could not resolve column/field reference: 'm'
), Query: select * from sample where eventdate between '2017-01-31' and dateadd(m,1,'2017-01-31').)

如果我在两个日期之间进行硬编码,而不是使用DATEADD,我会得到结果,例如

dbGetQuery(src,"SELECT * FROM sample WHERE eventdate BETWEEN '2017-01-31' AND '2017-02-28' LIMIT 5")

我得到上面代码的结果,但我想在我的代码中使用DATEADD,因为我有多个日期条件,我正在使用循环函数。

请帮忙。

r sql-server
2个回答
0
投票

问题是您的文字日期字符串('2017-01-31')的格式。 SQL Server,当为DATEADD传递日期的文字字符串时,将隐式地将值转换为datetimedatetime将以yyyy-dd-MM格式读取字符串,将值转换为20173101;你可以看到那里的问题(一年中没有31个月)。

如果您使用文字字符串来传递日期(时间),则使用格式yyyyMMddyyyy-MM-ddThh:mm:ss.sssssss,因为两者都是明确的,无论语言和数据类型如何。

所以,对于你的价值来说:

WHERE eventdate BETWEEN '20170131' AND DATEADD(m,1,'20170131')

另外,你真的在​​寻找2017013120170228之间的行,包括那些日期(假设eventdatedate)吗?


0
投票

使用Convert函数从DATEADD函数中删除时间。

dbGetQuery(src,"SELECT * FROM sample WHERE eventdate BETWEEN '2017-01-31' AND convert(varchar,DATEADD(month, 1, '2017/08/25'),23)")
© www.soinside.com 2019 - 2024. All rights reserved.