获取一个季度的第一天和最后一天以及 2 个季度的日期
Posted
技术标签:
【中文标题】获取一个季度的第一天和最后一天以及 2 个季度的日期【英文标题】:getting first day and last day of a quarter and 2 quarters back for a date 【发布时间】:2018-05-23 16:06:27 【问题描述】:如何获取日期的一个季度的第一天和最后一天? 以及 Hive 或 sql
中日期的 2 个季度的第一天和最后一天例如,对于 2014 年 2 月 3 日的第一天和季度的最后一天,将是 2014 年 1 月 1 日和 2014 年 3 月 31 日 并且对于同一日期,前两个季度的第一天和最后一天将是 2013 年 7 月 1 日和 2013 年 9 月 31 日
【问题讨论】:
欢迎来到 Stack Overflow。请阅读如何提供Minimal, Complete, and Verifiable example 您还可以从How to ask 和What is expected of SO users 中受益 【参考方案1】:您可以通过以下方式完成此操作(不是太花哨,但没有直接的方法)。为了简单起见,我只是连接了两个输出日期
-- before Hive 1.3
select
case
when ceil(month(mydate)/ 3.0) = 1 then concat("Jan 01 ",year(mydate),"|","Mar 31 ",year(mydate))
when ceil(month(mydate)/ 3.0) = 2 then then concat("Apr 01 ",year(mydate),"|","Jun 30 ",year(mydate))
when ceil(month(mydate)/ 3.0) = 3 then then concat("Jul 01 ",year(mydate),"|","Sep 30 ",year(mydate))
when ceil(month(mydate)/ 3.0) = 4 then then concat("Oct 01 ",year(mydate),"|","Dec 31 ",year(mydate))
else
null
end,
ceil(month(mydate)) as quarter
from (
select
from_unixtime(unix_timestamp('Feb 03 2014' , 'MMM dd yyyy')) as mydate
) t;
--Hive 1.3 or higher
select
case
when quarter(mydate) = 1 then concat("Jan 01 ",year(mydate),"|","Mar 31 ",year(mydate))
when quarter(mydate) = 2 then then concat("Apr 01 ",year(mydate),"|","Jun 30 ",year(mydate))
when quarter(mydate) = 3 then then concat("Jul 01 ",year(mydate),"|","Sep 30 ",year(mydate))
when quarter(mydate) = 4 then then concat("Oct 01 ",year(mydate),"|","Dec 31 ",year(mydate))
else
null
end,
ceil(month(mydate)) as quarter
from (
select
from_unixtime(unix_timestamp('Feb 03 2014' , 'MMM dd yyyy')) as mydate
) t;
只需在内部查询的选择中替换您的列的硬编码日期
【讨论】:
select to_date( concat(year(
_c0),"-",1+3*(quarter(
_c0)-1),"-01")) from ( select CURRENT_DATE() ) as asdf ;
Apache Hive(版本 2.3.2)
和学期开始select to_date( concat( YEAR(
_c0), "-0", CASE WHEN QUARTER(
_c0) IN (1, 2) THEN 1 ELSE 7 END, "-01" )) from ( select CURRENT_DATE() ) as asdf ;
以上是关于获取一个季度的第一天和最后一天以及 2 个季度的日期的主要内容,如果未能解决你的问题,请参考以下文章