如何在 Hive SQL 中获取季度至今?

Posted

技术标签:

【中文标题】如何在 Hive SQL 中获取季度至今?【英文标题】:How can I get Quarter to Date in Hive SQL? 【发布时间】:2017-05-15 15:42:43 【问题描述】:

我很难从 Hive SQL 获取季度至今的值。 如何在 Hive sql 中获取当前季度的第一天?

表名:订单

字段:日期、订单编号、销售编号

请指教。

【问题讨论】:

【参考方案1】:

这似乎是最干净的方式

with t as (select date '2016-08-27' as dt) 
select add_months(trunc(dt,'MM'),-(month(dt)-1)%3) from t
;

2016-07-01


这里还有 2 个选项

with t as (select date '2016-08-27' as dt) 
select  trunc(add_months(dt,-(month(dt)-1)%3),'MM') 
from    t
;

2016-07-01


with t as (select date '2016-08-27' as dt) 
select  add_months(trunc(dt,'YY'),cast((month(dt)-1) div 3 * 3 as INT)) 
from    t
;

2016-07-01

对于早期版本

with t as (select '2016-08-27' as dt)
select  printf('%04d-%02d-%02d',year(dt),(((month(dt)-1) div 3) * 3) + 1,1)
from    t

2016-07-01

同样的,但在今天

with t as (select from_unixtime(unix_timestamp(),'yyyy-MM-dd') as today)
select  printf('%04d-%02d-%02d',year(today),(((month(today)-1) div 3) * 3) + 1,1) as 
from    t

2017-04-01

【讨论】:

您好,非常感谢您的快速回复。那将是理想的答案。唯一的问题是我当前使用的 hive sql 版本是旧版本,不支持函数“add_months”和“trunc”。您知道不使用 'add_months' 和 'trunc' 的不同方法来实现预期结果吗? 嗨 Dudu,感谢您的后续回答。我尝试了您对早期 hive sql 版本的查询,我得到了正确的答案。但是,我希望我的查询没有硬编码日期,例如“2016-08-27”,因为随着时间的推移,例如第三季度到来,我希望我的查询自动更新。你知道怎么做吗?非常感谢您的帮助。谢谢! 此日期仅用于演示。您的查询应该类似于select printf('%04d-%02d-%02d',year(dt),(((month(dt)-1) div 3) * 3) + 1,1) from orders(将dt 替换为相关列) 嗨 Dudu,是的,我还将“2016-08-27”替换为“日期”列。所以我的查询如下所示: select printf('%04d-%02d-%02d',year(date),(((month(date)-1) div 3) * 3) + 1,1) as date from订单 我的日期字段的日期值可以追溯到 2013-01-01。因此,当我运行此查询时,我得到所有季度的第一天,最早可以追溯到 2013 年 1 月 1 日。您是否知道一种调整查询的方法,以便我只能获得当前季度的季度第一天?所以在这种情况下是 2017 年 4 月 1 日 非常感谢嘟嘟。这非常有效。最后一件事,除了这一年,你知道怎么做吗?所以我想得到当年的第一天。所以它会给 2017 年 1 月 1 日【参考方案2】:

如果你不能使用嘟嘟建议的各种日期函数,你总是可以将它转换为字符串,解析出月份,并使用case语句。根据您的 Hive 版本,您可能必须使用简单大小写而不是搜索。

(假设 YYYY-MM-DD)

case cast (substring (cast(<date field> as varchar(10)),6,2) as integer)
when between 1 and 3 then 1
when between 4 and 6 then 2
when between 7 and 9 then 3
else 4
end

丑陋,但应该可以。

【讨论】:

感谢 Andrew,当我运行您的查询时,我会得到相应季度的日期。这是伟大的。为此,我还使用以下内容:ceil(month(date)/3.0)。现在,我怎样才能只获得当前季度的第一天?因此,对于当前季度,它将是 4 月 1 日。注意:我不想硬编码日期,因为我希望它随着时间的变化而灵活。请指教。谢谢!

以上是关于如何在 Hive SQL 中获取季度至今?的主要内容,如果未能解决你的问题,请参考以下文章

用hive写一个获取本日期的季度初的sql

如何在 SQL Server 中获取一个季度的上个月数据?

获取一个季度的第一天和最后一天以及 2 个季度的日期

如何从SQL中的日期获取日历季度

SQL数据库代码如何根据日期获取属于哪个季度

如何在 hive sql 中获取每个组的最大 row_number()