我试图根据从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
,因为我有多个日期条件,我正在使用循环函数。
请帮忙。
问题是您的文字日期字符串('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
)吗?
使用Convert
函数从DATEADD函数中删除时间。
dbGetQuery(src,"SELECT * FROM sample WHERE eventdate BETWEEN '2017-01-31' AND convert(varchar,DATEADD(month, 1, '2017/08/25'),23)")