在 HIVE 中选择上个月的 YYYYMM

Posted

技术标签:

【中文标题】在 HIVE 中选择上个月的 YYYYMM【英文标题】:Selecting YYYYMM of the previous month in HIVE 【发布时间】:2015-04-30 17:47:38 【问题描述】:

我使用的是 Hive,因此 SQL 语法可能略有不同。如何获取上个月的数据?例如,如果今天是 2015-04-30,我需要 201503 这种格式的 3 月的数据吗?谢谢!

select 
    employee_id, hours,
    previous_month_date--YYYYMM,
from 
    employees 
where 
    previous_month_date = cast(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd') as int)

【问题讨论】:

另一个可能的想法,我附加到 where 子句。但是它适用于当月,但不适用于上个月。此外,添加 0 仅对 01、02、03...等 1 位数的月份有帮助,我认为第 10、11、12...等月份显示为 010、011、012。我试图避免这种情况: cast(concat(year(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')), 0,month(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd'))) as int); 如果日期是 2015-07-31 会发生什么。没有 6 月 31 日 【参考方案1】:

根据经验,使用 DATE_ADD(Today, -1-Day(Today)) 来计算上个月的最后一天更安全,而不必担心边缘情况。从那里你可以做你想做的事,例如

select
  from_unixtime(unix_timestamp(), 'yyyy-MM-dd') as TODAY,
  date_add(from_unixtime(unix_timestamp(), 'yyyy-MM-dd'), -1-cast(from_unixtime(unix_timestamp(), 'd') as int)) as LAST_DAY_PREV_MONTH,
  substr(date_add(from_unixtime(unix_timestamp(), 'yyyy-MM-dd'), -1-cast(from_unixtime(unix_timestamp(), 'd') as int)), 1,7) as PREV_MONTH,
  cast(substr(regexp_replace(date_add(from_unixtime(unix_timestamp(), 'yyyy-MM-dd'), -1-cast(from_unixtime(unix_timestamp(), 'd') as int)), '-',''), 1,6) as int) as PREV_MONTH_NUM
from WHATEVER limit 1

-- today       last_day_prev_month  prev_month  prev_month_num
-- 2015-08-13  2015-07-30           2015-07             201507

请参阅有关 date functions、string functions 等的 Hive 文档。

【讨论】:

【参考方案2】:

下面的作品跨越年份,没有复杂的计算:

date_format(add_months(current_date, -1), 'yyyyMM') --上个月的yyyyMM

一般来说,

date_format(add_months(current_date, -n), 'yyyyMM') --前n个月的yyyyMM

为需要的方向使用正确的标志(向后/向前)

【讨论】:

【参考方案3】:

您可以为上述日期执行(year('2015-04-30')*100+month('2015-04-30'))-1,它将返回201503 或类似(year(from_unixtime(unix_timestamp()))*100+month(from_unixtime(unix_timestamp())))-1 的今天的上个月。假设您的日期列采用“yyyy-mm-dd”格式,您可以使用第一个示例并将日期字符串替换为您的表列名称;对于第二个示例将执行的任何其他格式,请在 unix_timestamp() 运算符中添加列名。

【讨论】:

【参考方案4】:

Angelo 的回复是一个好的开始,但如果原始日期是 2015-01-XX,它会返回 201500。基于他的回答,我建议使用以下内容:

IF(month($DATE) = 1,
    (year($DATE)-1)*100 + 12,
    year($DATE)*100 + month($DATE)-1
) as month_key

【讨论】:

【参考方案5】:

如果你去掉输入字符串中的那些连字符,你可以通过 YYYYMM 格式获得上一个日期的月份 ID:-

select if(  (($hiveconf:MonthId-1)%100)=0  ,$hiveconf:MonthId-89,$hiveconf:MonthId-1  ) as PreviousMonthId;

【讨论】:

以上是关于在 HIVE 中选择上个月的 YYYYMM的主要内容,如果未能解决你的问题,请参考以下文章

SAS:创建可以回顾 x 个月的参数

在 Hive 中将 dd/mm/yyyy/hh/mm/ss 格式更改为 yyyymm

请输入时间格式YYYYMM是啥?

Tsql -> 从今天开始过滤 6 个月的数据,表中的日期字段为 YYYYMM

js 日期下拉框下拉框内容显示日期YYYYMM,要求范围:系统时间前4个月、后8个月。怎么实现?

使用 sql (Hive) 中的条件为每个 ID 选择随机行