如何在 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 中获取季度至今?的主要内容,如果未能解决你的问题,请参考以下文章