#sql #oracle #impala #sysdate
#sql #Oracle #impala #sysdate
Вопрос:
У меня есть предложение WHERE, которое я пытаюсь преобразовать из ORACLE SQL в Impala SQL. Вывод col2 выглядит примерно как 201406. Мне нужно, чтобы это было доступно для чтения в Impala, затем отформатируйте его, а затем превратите в строку. Любая помощь была бы высоко оценена!
WHERE Table1.col2 <= to_char( SYSDATE-7, 'YYYYMM')
Комментарии:
1. Стандартом ANSI было бы
CURRENT_TIMESTAMP
. Возможно, ваша база данных поддерживает стандарт.2. Спасибо. итак, как мне сделать текущую временную метку в формате ГГГГ?? а затем минус 7 месяцев от нее
3. Проверьте руководство: функции форматирования форматирования должны быть задокументированы. Чтобы сделать «минус», вы можете сделать
current_timestamp - interval '7' month
в стандартном SQL.4. Может быть, следующая ссылка поможет? cloudera.com/content/cloudera-content/cloudera-docs/Impala /…
5. @DavidFaber —
current_timestamp()
иdate_sub()
решить половину проблемы. Но добиться соответствия в формате ‘ГГГГ’ будет сложнее.
Ответ №1:
current_timestamp() является псевдонимом now(), поэтому любой из них может использоваться вместо sysdate
SYSDATE-7 — это sysdate минус 7 дней, поэтому эквивалент WHERE Table1.col2 <= to_char( SYSDATE-7, 'YYYYMM')
равен
WHERE Table1.col2 <= concat( cast(year(to_date( days_add(current_timestamp(),-7 ))) as string), cast(month(to_date( days_add(current_timestamp(),-7 ) )) )
или, если вычет составляет 7 месяцев, тогда:
concat( cast(year(to_date( months_add(current_timestamp(),-7 ))) as string), cast(month(to_date( months_add(current_timestamp(),-7 ) )) )
обратите внимание, все непроверенные, и я использовал days_add() или months_add (), поскольку многие люди предпочитают использовать минус 7 вместо days_sub () с положительным значением 7. Однако я предполагаю, что это сработает (это работает в MySQL, который имеет аналогичные функции арифметики даты).
Также обратите внимание, что подразумевается, что ваше поле Table1.col2 имеет строковый тип, если это целое число, то требуется немного другое решение.
year( months_add(current_timestamp(),-7 ) ) * 100 month(days_add(current_timestamp(),-7 ))
year( months_add(current_timestamp(),-7 ) ) * 100 month(months_add(current_timestamp(),-7 ))
Комментарии:
1. Похоже, что это должно сработать, потому что, как вы сказали, функциональность более или менее такая же, как у Mysql. У меня это пока не работает, но я придумал для этого действительно длинный хакерский / грубый sql-код с impala 1.1.3
2. да, это будет долго и грубо, как кажется, извините, но я не могу это протестировать, поэтому я не уверен, как помочь дальше
Ответ №2:
Используйте приведенный ниже синтаксис:
select from_unixtime(unix_timestamp(now()), 'yyyy-MM-dd')