获取上一季度的最后一天

Getting last day of previous quarter

当我运行

SELECT
  MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE())-1 QUARTER - INTERVAL 1 DAY

here,它按预期工作。但是,在 Hive 中,我收到一个错误,指出我缺少右括号。我的查询是:

SELECT t1.*, t2.programme
    FROM table1 t1
    LEFT JOIN (SELECT programme FROM table2
        WHERE yyyy_mm_dd = MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE())-1 QUARTER - INTERVAL 1 DAY
    ) t2 ON t2.id = t1.id AND t2.yyyy_mm_dd = t1.yyyy_mm_dd

我做错了什么?

Error while compiling statement: FAILED: ParseException line 4:75 missing ) at 'QUARTER' near 'QUARTER' l

我们正在使用 Hive v1.1.0。

Hive 的语法和功能与 MySQL 不同。

Here 是 Hive 支持的所有日期函数的列表。

使用这些函数,您的 SELECT 查询转换为:

SELECT
  date_add(add_months(trunc(date()), (extract(quarter from date()) -1 ) * 3)), -1)

这可以通过多种方式实现。两种方法:

select last_day(printf('%04d-%02d-%02d',year(current_date),(month(current_date)-1) div 3 * 3 ,1));

Returns:

2019-03-31

还有一个方法:

select last_day(concat(year(current_date),'-',lpad((month(current_date)-1) div 3 * 3,2,0) ,'-01'))

重要版本注意: 在旧版本的 Hive 中 current_date 可能不起作用,请改用 unix_timestamp()

select last_day(concat(year(current_timestamp()),'-',lpad((month(current_timestamp())-1) div 3 * 3,2,0) ,'-01'))

阅读 manual 并发明您自己的方法。