Предложение Sql Between с несколькими столбцами

#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 позволят вам превратить год месяц в действительную дату для первого числа месяца в качестве истинной даты.