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

时间:2019-03-01 12:33:45

标签: r sql-server

我试图根据连接到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,因为我有多个使用循环函数执行的日期条件。

对此有任何帮助。

2 个答案:

答案 0 :(得分: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)?

答案 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)")