Эффективный способ добавить месяцы в числовой формат YMD?

В настоящее время я занят некоторыми SQL (как в Netezza, так и в HiveQL). Наша компания часто использует числовые поля для дат (например, 20150602 для даты, 20160400 для месяца).

Мне нужно добавить 6 месяцев к одной из этих дат, и обычно я делаю:

cast(to_char(add_months(to_date(A.date,'yyyyMMdd'),6),'yyyyMMdd') as int) 

Хотя это не красиво, это работает, и я не знаю более короткого или лучшего способа. Мои основные проблемы заключаются в том, что это большая таблица (12 миллиардов строк), и преобразование даты не совсем быстрое, а запрос, над которым я работаю, убивается из-за слишком долгой работы. Есть ли лучший способ сделать это?


person BallzofFury    schedule 31.08.2017    source источник
comment
какой тип данных у этих полей? а какая у вас версия Hive?   -  person Vamsi Prabhala    schedule 31.08.2017
comment
Это не код Улья   -  person David דודו Markovitz    schedule 31.08.2017
comment
@Dudu: Вы правы, это Netezza. Проблема все та же.   -  person BallzofFury    schedule 31.08.2017
comment
@Vamsi: тип данных — int. Версия улья 1.2.1000.2.5.3.0-37.   -  person BallzofFury    schedule 31.08.2017
comment
Теги, связанные с Hive, удалены. Если вы хотите задать вопрос, связанный с Hive, откройте для него новый пост.   -  person David דודו Markovitz    schedule 31.08.2017
comment
SELECT DATEADD(M,6,'20160602') результат 2016-12-02 00:00:00.000   -  person Jacob H    schedule 31.08.2017
comment
Что вы подразумеваете под преобразованием даты не быстро? Я обычно считаю, что это довольно быстро. Вы меняете дату с помощью UPDATE или CTAS?   -  person ScottMcG    schedule 31.08.2017
comment
@ScottMcG: я имею в виду, что это относительно медленно, как в сравнении с целочисленной арифметикой. Я начинаю думать, что не смогу преобразовать его в дату, поэтому я попытаюсь посмотреть на некоторые другие оптимизации ранее в запросе.   -  person BallzofFury    schedule 31.08.2017
comment
Я думаю, вы правы в том, что нет никакого способа избежать преобразования, явного или неявного, но я делаю такого рода преобразование все время, и даже на старой одинарной стойке Twinfin я совсем не беспокоюсь об этом. Но контекст тоже имеет значение. Вы хотите сделать add_months как часть ETL или это часть запроса BI или ...?   -  person ScottMcG    schedule 31.08.2017
comment
Я занимаюсь созданием функций для модели машинного обучения. Дело в том, что я хочу присоединить действительно большую таблицу к другой, основываясь на событиях, происходящих в течение 6 месяцев от даты. Присоединение, вероятно, также является достойной частью замедления. Теперь, когда вы упомянули об этом, будет ли объединение по неравенству по дате медленнее, чем соединение по целочисленному неравенству?   -  person BallzofFury    schedule 31.08.2017
comment
Держу пари, что ты прав. Это скорее неравенство замедляет вас, чем любое преобразование типов. Netezza хранит даты и целые числа под прикрытием как целые числа, и они хешируют/сравнивают с одинаковой эффективностью, так что это нормально. Обязательное вложенное циклическое соединение, которое вы получаете при соединении по неравенству, будет намного медленнее, чем оптимальное/обычное хеш-соединение.   -  person ScottMcG    schedule 31.08.2017


Ответы (1)


Я бы попробовал присоединиться к таблице измерения времени с этими столбцами (ALL int): MonthId StartDate EndDate 1 20150101 20150199 2 20150201 20150299 3 20150301 20150399 . . . 24 20161201 20161299

Затем сделайте это, если вам просто нужен первый день месяца в результате (потребуется другое расписание, если вы хотите присоединиться к преобразованию полной даты, но этот пример легче написать на iPad и его можно расширить):

select 
  t2.startdate, 
  y.* 
from yourtable y
Join timetab t1
  on y.dateAsInt between t1.StartDate and t1.EndDate
Join t2 
  On t1.monthid=t2.monthid-6
person Lars G Olsen    schedule 31.08.2017