#sql #apache-spark-sql
#sql #apache-spark-sql
Вопрос:
Я пытаюсь получить даты между январем 2016 и мартом 2018. Я использовал приведенный ниже запрос. Но оно не возвращает надлежащих результатов. Входные столбцы будут получены во время выполнения. Мы не можем преобразовать его в дату, поскольку входные столбцы могут содержать квартал.
SELECT Year,Month,DayOfMonth
FROM period
WHERE
(Year >= 2016 and monthofyear >= 1 )
OR (Year <= 2018 and monthofyear <= 3 )
GROUP BY
Year,Month,DayOfMonth order by year,DayOfMonth;
Ответ №1:
Логика в вашем WHERE
предложении, похоже, отключена. Я думаю, вы хотите это:
SELECT Year, Month, DayOfMonth
FROM period
WHERE
(Year = 2017 AND monthofyear >= 1) OR
(Year = 2018 AND monthofyear <= 3)
GROUP BY
Year,
Month,
DayOfMonth
ORDER BY
Year,
DayOfMonth;
То есть, единственными разрешенными годами являются 2017 и 2018, и каждый год обрабатывается отдельной логикой. Для 2017 года мы принимаем любой месяц, начиная с января, а для 2018 года мы принимаем только март или ранее.
Редактировать:
Если вместо этого вы хотели охватить диапазон с января 2016 по март 2019 года, тогда мы можем попробовать:
WHERE
Year IN (2016, 2017) OR
(Year = 2018 AND monthofyear <= 3)
Комментарии:
1. Это не сработает, если пользователю нужны данные за период с января 2016 по март 2019 года
2. @dassum Проверьте мой обновленный ответ, мы все еще можем использовать этот подход даже с вашим новым предлагаемым диапазоном.
Ответ №2:
Используйте соответствующую функцию приведения, чтобы преобразовать ваш год месяц в истинную дату год месяц 01 и преобразовать в дату, скажем, в формате ГГГГММДД. Вы добавляете 01 в свое выражение. Теперь об этом позаботится арифметика даты
where to_date(year month '01','YYYYMMDD') between to_date('20170101','YYYYMMDD') and to_date('20180301','YYYYMMDD')
Выше приведен oracle biased SQL, но все SQLS позволят вам превратить год месяц в действительную дату для первого числа месяца в качестве истинной даты.