Sql 在配置单元中选择上月的YYYYMM

Sql 在配置单元中选择上月的YYYYMM,sql,hive,hiveql,Sql,Hive,Hiveql,我使用的是配置单元,因此SQL语法可能略有不同。如何获取上个月的数据?例如,如果今天是2015-04-30,我需要3月份的数据,格式为201503?谢谢 select employee_id, hours, previous_month_date--YYYYMM, from employees where previous_month_date = cast(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd') as i

我使用的是配置单元,因此SQL语法可能略有不同。如何获取上个月的数据?例如,如果今天是2015-04-30,我需要3月份的数据,格式为201503?谢谢

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

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

Angelo的答复是一个良好的开端,但如果原始日期为2015-01-XX,则返回201500。根据他的回答,我建议使用以下方法:

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

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

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

请参阅有关等的配置单元文档。

如果您删除了输入字符串中的连字符,则可以通过以下方式获得YYYYMM格式的上一个日期的月份id:-

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

以下工程跨越年度边界,无复杂计算:

日期格式(添加月份(当前日期,-1),'yyyyymm')
——上个月的yyyyMM

总的来说

date\u格式(添加月份(当前日期,-n),'yyyyymm')
——前n个月的yyyyMM


使用适当的符号表示所需的方向(后退/前进)

另一个可能的想法,我附加到where子句。但是,它适用于当前月份,但不适用于上个月。此外,添加0只对1位数的月份有帮助,如01、02、03…等,我认为10、11、12…等月份显示为010、011、012。我试图避免这种情况:cast(concat(年(从UNIX\u TIMESTAMP(),'yyyy-MM-dd')),0,月(从UNIX\u TIMESTAMP(),'yyyy-MM-dd')转换为int);如果日期为
2015-07-31
,会发生什么情况。6月31日没有航班