在 HIVE 中选择上个月的 YYYYMM
Selecting YYYYMM of the previous month in HIVE
我正在使用 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)
您可以对上述日期执行 (year('2015-04-30')*100+month('2015-04-30'))-1
,它将对上个月的今天执行 return 201503
或 (year(from_unixtime(unix_timestamp()))*100+month(from_unixtime(unix_timestamp())))-1
之类的操作。假设您的日期列采用 'yyyy-mm-dd' 格式,您可以使用第一个示例并将日期字符串替换为您的 table 列名称;对于第二个示例将执行的任何其他格式,请在 unix_timestamp()
运算符中添加列名称。
Angelo 的回复是一个好的开始,但 returns 201500 如果原始日期是 2015-01-XX。根据他的回答,我建议使用以下内容:
IF(month(${DATE}) = 1,
(year(${DATE})-1)*100 + 12,
year(${DATE})*100 + month(${DATE})-1
) as month_key
根据经验,使用 DATE_ADD(Today, -1-Day(Today)) 计算 last-day-of-previous-month 更安全不必担心边缘情况。从那里你可以做你想做的事例如
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 文档
如果您去掉了输入字符串中的那些连字符,您可以通过以下方式获得 YYYYMM 格式的上一个日期的月份 ID:-
select if( ((${hiveconf:MonthId}-1)%100)=0 ,${hiveconf:MonthId}-89,${hiveconf:MonthId}-1 ) as PreviousMonthId;
以下跨年界工作w/o 复杂计算:
date_format(add_months(current_date, -1), 'yyyyMM')
--上个月的 yyyyMM
一般来说,
date_format(add_months(current_date, -n), 'yyyyMM')
--前第n个月的yyyyMM
为需要的方向使用正确的符号(back/ahead)
我正在使用 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)
您可以对上述日期执行 (year('2015-04-30')*100+month('2015-04-30'))-1
,它将对上个月的今天执行 return 201503
或 (year(from_unixtime(unix_timestamp()))*100+month(from_unixtime(unix_timestamp())))-1
之类的操作。假设您的日期列采用 'yyyy-mm-dd' 格式,您可以使用第一个示例并将日期字符串替换为您的 table 列名称;对于第二个示例将执行的任何其他格式,请在 unix_timestamp()
运算符中添加列名称。
Angelo 的回复是一个好的开始,但 returns 201500 如果原始日期是 2015-01-XX。根据他的回答,我建议使用以下内容:
IF(month(${DATE}) = 1,
(year(${DATE})-1)*100 + 12,
year(${DATE})*100 + month(${DATE})-1
) as month_key
根据经验,使用 DATE_ADD(Today, -1-Day(Today)) 计算 last-day-of-previous-month 更安全不必担心边缘情况。从那里你可以做你想做的事例如
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 文档
如果您去掉了输入字符串中的那些连字符,您可以通过以下方式获得 YYYYMM 格式的上一个日期的月份 ID:-
select if( ((${hiveconf:MonthId}-1)%100)=0 ,${hiveconf:MonthId}-89,${hiveconf:MonthId}-1 ) as PreviousMonthId;
以下跨年界工作w/o 复杂计算:
date_format(add_months(current_date, -1), 'yyyyMM')
--上个月的 yyyyMM
一般来说,
date_format(add_months(current_date, -n), 'yyyyMM')
--前第n个月的yyyyMM
为需要的方向使用正确的符号(back/ahead)