根据配置单元中的字符串值计算季度

gtlvzcf8  于 2021-07-15  发布在  Hive
关注(0)|答案(2)|浏览(500)

我需要使用小于1.3的配置单元版本从字符串字段获取季度,因此不能使用季度特性
字符串字段中的示例数据格式是--20210415
我试着用 CONCAT('T',(INT((MONTH(from_unixtime(unix_timestamp(,'yyyymmdd')))-1)/3)+1)) 但它显示的是t1,而应该显示t2(因为四月在第二季度20210415),但这个表达式在计算季度之前不会将字符串转换为日期
所以,我用铸造法把它改成了日期 cast(to_date(from_unixtime(unix_timestamp(date, 'yyyymmdd'))) as date) 它转换了,但产量是2021年1月15日和相同的转换为季度使用 CONCAT('T',(INT((MONTH(cast(to_date(from_unixtime(unix_timestamp(qc_creation_date, 'yyyymmdd'))) as date))-1)/3)+1)) 有没有办法解决这个问题,比如在for ex:string 20210415中,输出应该是t2。请帮忙
当做

lnlaulya

lnlaulya1#

我找到解决办法了 CONCAT('Q',(INT((MONTH(cast(to_date(from_unixtime(unix_timestamp(, 'yyyyMMdd'))) as date))-1)/3)+1)) 谢谢

41ik7eoe

41ik7eoe2#

您的日期格式 yyyyMMdd 可以有效地转换为配置单元格式 yyyy-MM-dd 使用 regexp_replace 函数而不是 unix_timestamp + from_unixtime 使用SimpleDataFormat的函数。查询中的错误是错误的格式模板,它应该是'yyyymmdd',请参阅simpledateformat。但是regexp\u替换要简单得多,使用 unix_timestamp + from_unixtime 仅在无法使用regexp\u replace执行相同操作时。
不需要铸造它的日期,字符串工程罚款。
对于Hive< 1.3.0 提取月份并使用 ceil(month/3.0) :

select ceil(month(regexp_replace('20210415','(\\d{4})(\\d{2})(\\d{2})','$1-$2-$3'))/3.0) -- returns 2

更简单的方法:

select ceil(regexp_extract('20210415','^(\\d{4})(\\d{2})',2)/3) --returns 2

自从Hive1.3.0以来 quarter(date/timestamp/string) 功能。
演示:

quarter(regexp_replace('20210415','(\\d{4})(\\d{2})(\\d{2})','$1-$2-$3')); --Returns 2

相关问题