Ошибка при использовании SQL-запроса с условием DATEADD в R - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь извлечь данные, основанные на условии даты, соединяющейся с SQL, из R. Мое соединение с базой данных от 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 голосов
/ 01 марта 2019

удалить время из функции DATEADD с помощью функции Convert.

dbGetQuery(src,"SELECT * FROM sample WHERE eventdate BETWEEN '2017-01-31' AND convert(varchar,DATEADD(month, 1, '2017/08/25'),23)")
0 голосов
/ 01 марта 2019

Проблема в формате вашей буквенной строки даты ('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)?

...