hive - 如果日期为 mmYYY 格式(mm-->Month,YYYY--->Year),如何获取月份部分?
问题描述
我需要从日期以 mmYYYY(032019) 格式存储的一列中获取“月份”。我需要获取月份列,如果月份值在 01,02,03(Jan,Feb,march) 中,那么我需要生成新列作为 2018-19。如果值为 072019,则需要生成新值作为 2019-20。我尝试下面的代码但没有得到想要的结果。有人可以指导我如何实现这一点。
CASE WHEN month(to_date(from_unixtime(unix_timestamp(dt), 'dd-MM-yyyy'))) IN (01,02,03) THEN
CONCAT(CONCAT(year(to_date(from_unixtime(unix_timestamp(dt), 'dd-MM-yyyy'))))-1,'-'),
substr(year(to_date(from_unixtime(unix_timestamp(dt), 'dd-MM-yyyy')))),3,4))
ELSE CONCAT(CONCAT(year(to_date(from_unixtime(unix_timestamp(dt), 'dd-MM-yyyy')))),'-'),
SUBSTR(year(to_date(from_unixtime(unix_timestamp(dt), 'dd-MM-yyyy'))))+1,3,4)) end
因为我的 dt 列不是 'dd-mm-yyyy' 格式,所以由于某些情况它没有给出正确的值,我不想使用直接子字符串函数从 dt 获取月份部分。我想使用月份函数或任何其他可以获取月份部分的函数来获取它,然后根据月份部分相应地生成输出列。
Sample Data.
dt=012019
output : 2018-19
dt=022019
output : 2018-19
dt=032019
output : 2018-19
dt=042019
output : 2019-20
dt=052019
output : 2019-20
dt=062019
output : 2019-20
解决方案
下面的代码对我有用。
CASE WHEN month(to_date(from_unixtime(unix_timestamp(dt,'MMyyyy')))) IN (01,02,03)
THEN concat(concat(year(to_date(substr(from_unixtime(unix_timestamp(dt, 'MMyyyy')),1,10)))-1,'-')
,substr(year(to_date(from_unixtime(unix_timestamp(dt, 'MMyyyy')))),3,4))
ELSE concat(concat(year(to_date(from_unixtime(unix_timestamp(dt, 'MMyyyy')))),'-'),
substr(year(to_date(substr(from_unixtime(unix_timestamp(dt, 'MMyyyy')),1,10)))+1,3,4)) END
推荐阅读
- jenkins - Cake.AppCenter:找不到可执行文件
- reactjs - 在类组件中在哪里分配变量?
- java - 如何在 MainActivity 中使用子活动的数据并将其用作其他方法中的参数
- javascript - 我可以为字节标志中的特定位表示 NULL 吗?
- wxpython - 如何使用 wxpython 为文件路径创建下拉列表?
- tensorflow - 如何在 tensorflow 上对 Keras 模型的输入进行加权?
- python - Python 正则表达式匹配任何包含 n 位数字的单词,但也可以包含其他字符
- rust - 不合格使用的 Rust 导入特征
- javascript - JavaScript 中的 Roboto 字体不支持 Maltese Cross Unicode
- android - 如何修复“java.lang.NoClassDefFoundError:com/android/tools/r8/com/google/common/collect/ImmutableMultiset”错误