【问题标题】:Getting last day of previous quarter获取上一季度的最后一天
【发布时间】:2019-09-30 10:58:00
【问题描述】:

当我跑步时

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

我做错了什么?

编译语句时出错:FAILED: ParseException line 4:75 missing ) at 'QUARTER' near 'QUARTER' l

我们正在使用 Hive v1.1.0。

【问题讨论】:

  • 你能描述一下这是做什么的吗:MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE())-1 QUARTER - INTERVAL 1 DAY
  • @leftjoin 它获取最近一个季度的最后一天

标签: sql date hive calendar hiveql


【解决方案1】:

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

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

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

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

【讨论】:

  • 这会在表达式规范中的“INTERVAL”附近给出不匹配的输入“QUARTER”预期)。如果我将第一个 ( 放在 where 子句中的 yyyy_mm_dd 之前,结果相同。
  • 好的,但它仍然提示您语法不正确。您在 MySQL 中尝试了 SELECT 查询。 Hive 在各个方面都没有与 MySQL 相同的语法。我会在这方面改变答案。
  • @Someguywhocodes 修改了答案以使用实际的 Hive 语法。
  • 看起来我们使用的是 hive v1.1.0,它不支持quarter。没有quarter,是否有任何解决方法可以做同样的事情?我会更新我原来的Q
  • @Someguywhocodes 当然,只需执行季度 = ((月 -1) / 3) +1。
【解决方案2】:

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

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

返回:

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 并发明自己的方法。

【讨论】:

  • 完美运行。现在我有第二个问题。如果我做WHERE yyyy_mm_dd = select last_day(printf('%04d-%02d-%02d'...,那么我的ON 加入条件将永远是2019/03/31。我需要在本季度的最后一天从 p 表格中选择程序,然后加入全套p.yyyy_mm_dd。谢谢您的帮助。 @leftjoin
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多