我试图根据连接到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
,因为我有多个使用循环函数执行的日期条件。
对此有任何帮助。
答案 0 :(得分:0)
问题在于您的文字日期字符串('2017-01-31'
)的格式。 SQL Server在传递DATEADD
的日期文字字符串时,会将值隐式转换为datetime
。 datetime
将读取格式为yyyy-dd-MM
的字符串,将值转换为20173101
;您可以在那里看到问题(一年中没有31个月)。
如果您使用文字字符串传递日期(时间),则使用yyyyMMdd
或yyyy-MM-ddThh:mm:ss.sssssss
格式,因为无论语言和数据类型,二者都是明确的。
因此,对于您来说,价值是:
WHERE eventdate BETWEEN '20170131' AND DATEADD(m,1,'20170131')
换句话说,您是否真的要在20170131
和20170228
之间查找包含这些日期的行(假设eventdate
是date
)?
答案 1 :(得分:0)
使用Convert
函数从DATEADD函数中删除时间。
dbGetQuery(src,"SELECT * FROM sample WHERE eventdate BETWEEN '2017-01-31' AND convert(varchar,DATEADD(month, 1, '2017/08/25'),23)")