【问题标题】:How to find the difference between months如何找到月份之间的差异
【发布时间】:2019-07-31 13:58:32
【问题描述】:

我试图找出两个月值之间的差异。输入月份值的格式为 YYYYMMM。我希望结果与一个字符连接能够过滤我表中的一个字段。

例如 - 我想找出 2019M04(即 2019 年 4 月)和 2018M12(即 2018 年 12 月)之间的差异。这里所需的结果是 04,所以我希望它与字母“T”连接。因此,我的过滤器将位于 T04 字段。

基本思想是根据作为变量的月份值动态识别要应用过滤器的列。

我尝试过使用 Datediff,但没有得到任何结果。也许我做错了什么..请帮忙!!

样本数据 -

T01 T02 T03 T04 T05 T06

1.2 1.3 1.5 1.6 1.7 1.2

2.4 2.5 2.7 2.4 2.7 2.8

【问题讨论】:

  • 对,对不起...我正在使用 Hadoop 数据库。
  • 请同时提供一些示例数据和您已经尝试过的查询。
  • 样本数据 - T01 T02 T03 T04 T05 T06 1.2 1.3 1.5 1.6 1.7 1.2 2.4 2.5 2.7 2.4 2.7 2.8
  • Hadoop 是一个文件存储系统。你在使用 Hive 吗?
  • 是的,我正在使用 HIVE

标签: sql hadoop hive


【解决方案1】:

您可以转换为数字并进行算术运算。大多数数据库都支持left()right() 字符串函数。

要将差值作为一个数字,您可以这样做:

select ( ( cast(left(yyyymmm1, 4) as int) * 12 + cast(right(yyyymm1, 2) as int) - 1 ) -
         ( cast(left(yyyymmm2, 4) as int) * 12 + cast(right(yyyymm2, 2) as int) - 1 ) 
       ) as diff

然后你可以随意格式化它。

在 Hive 中,试试这个:

select ( ( cast(substr(yyyymmm1, 1, 4) as int) * 12 + cast(substr(yyyymm1, 5, 2) as int) - 1 ) -
         ( cast(substr(yyyymmm2, 1, 4) as int) * 12 + cast(substr(yyyymm2, 5, 2) as int) - 1 ) 
       ) as diff

【讨论】:

  • 显然 HIVE 不接受 left() 或 right()。所以我尝试了 substr() 。但是我的查询给出了 NULL 输出 select ( ( cast(substr('2019M06', 4) as int) * 12 + cast(substr('2019M06', -2) as int) - 1 ) - ( cast(substr(' 2018M12', 4) as int) * 12 + cast(substr('2018M12', -2) as int) - 1 ) ) 作为与 xyz 的差异
  • 好的,我之前发布的 substr 对于 right() 替换工作正常。但对于 left() 它不是。下面的效果很好 - select ( ( cast(substr('2019M06',0,4) as int) * 12 + cast(substr('2019M06',-2) as int) - 1 ) - ( cast(substr(' 2018M12',0,4) as int) * 12 + cast(substr('2018M12',-2) as int) - 1 ) ) as diff from xyz 感谢 Gordon 的帮助。我是 SQL 新手,所以我对此感到困惑。
猜你喜欢
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2020-08-25
  • 2020-03-28
  • 1970-01-01
  • 2013-01-02
相关资源
最近更新 更多