2015-10-08 7 views
6

Я использую SQL в Импале, чтобы написать этот запрос. Я пытаюсь преобразовать строку даты, сохраненную в формате YYYYMMDD, в формат дата в целях выполнения запроса, как это:Преобразование YYYYMMDD String to Date в Impala

SELECT datadate, 
     session_info 
FROM database 
WHERE datadate >= NOW() - INTERVAL 5 DAY 
ORDER BY datadate DESC; 

Поскольку >= NOW() - INTERVAL 5 DAY кода не будет работать со строкой ГГГГММДДА, я 'd хотел бы найти способ конвертировать это в формат даты, который будет работать с этим типом запроса. Моя мысль в том, что она должна выглядеть следующим образом (на основе аналогичных вопросов о других редакторов SQL запросов), но это не работает в Impala:

SELECT datadate, 
     session_info, 
     convert(datetime, '20141008', 102) AS session_date 
FROM database 
WHERE session_date >= NOW() - INTERVAL 5 DAY 
ORDER BY session_date DESC; 

Кто знает, как это сделать в Impala?

EDIT:

Я наконец-то нашел работающее решение этой проблемы. Ни одна из попыток с использованием конфигурации CAST или CONVERT не будет работать в Impala, но ниже запрос решает эту проблему и в полном объеме, что позволяет дата математика должна быть выполнена на колонке, содержащую строковые значения:

SELECT datadate, 
     session_info 
FROM database 
WHERE datadate >= from_unixtime(unix_timestamp(now() - interval 5 days), 'yyyyMMdd') 
GROUP BY datadate 
ORDER BY datadate DESC; 
+0

посмотреть на 'месяц (20141008)' и 'год (20141008)' –

+0

@vkp функции 'MONTH()' и 'YEAR()' работают в данных Impala, хранящихся как дата или временная метка, но это не работают для строковых данных. – nxl4

+0

посмотреть документацию http://www.cloudera.com/content/cloudera/en/documentation/cloudera-impala/latest/topics/impala_datetime_functions.html –

ответ

7

См Timestamp литералы на http://www.cloudera.com/content/cloudera/en/documentation/cloudera-impala/latest/topics/impala_literals.html

Вы должны добавить тире в строку так Impala будет иметь возможность преобразовать его в дату/временную метку. Вы можете сделать это с чем-то вроде:

concat_ws('-', substr(datadate,1,4), substr(datadate,5,2), substr(datadate,7)) 

, который можно использовать вместо datadate в вашем выражении.

Смежные вопросы