具有多列的子句之间的SQL

时间:2019-03-27 05:20:39

标签: sql apache-spark-sql

我正在尝试获取2016年1月至2018年3月之间的日期。我使用了以下查询。但是它没有返回适当的结果。输入列将在运行时出现。我们无法将其转换为日期,因为输入列可以包含四分之一。

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;

Period Table

2 个答案:

答案 0 :(得分:3)

您的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年,我们接受从1月开始的任何月份,而对于2018年,我们仅接受3月或更早的时间。

编辑:

如果您想覆盖2016年1月至2019年3月的范围,则可以尝试:

WHERE
    Year IN (2016, 2017) OR
    (Year = 2018 AND monthofyear  <= 3)

答案 1 :(得分:0)

使用适当的强制转换功能将您的年+月强制转换为年+月+ 01的真实日期,并以YYYYMMDD的格式转换为日期。您在表达式中添加01。现在,日期运算将解决它

where to_date(year+month+'01','YYYYMMDD') between to_date('20170101','YYYYMMDD') and to_date('20180301','YYYYMMDD')

Abovt是oracle偏向的SQL,但是所有SQL都可以让您将年+月转换为有效日期,并将该月的第一天作为真实日期。