将月份添加到数字 YMD 格式的有效方法?

Posted

技术标签:

【中文标题】将月份添加到数字 YMD 格式的有效方法?【英文标题】:Efficient way to add months to a numeric YMD format? 【发布时间】:2017-08-31 16:33:26 【问题描述】:

我目前正忙于处理一些 SQL(在 Netezza 和 HiveQL 中)。我们公司经常使用数字字段来表示日期(例如 20150602 表示日期,20160400 表示月份)。

我需要将这些日期之一加上 6 个月,通常我会这样做:

cast(to_char(add_months(to_date(A.date,'yyyyMMdd'),6),'yyyyMMdd') as int) 

虽然这不是很漂亮,但它确实有效,而且我不知道有什么更短或更好的方法。我的主要问题是这是一个大表(120 亿行),并且日期转换不是很灵活,而且我正在处理的查询由于运行时间过长而被杀死。有没有更好的方法来做到这一点?

【问题讨论】:

这些字段的数据类型是什么?您使用的是哪个版本的 Hive? 这不是 Hive 代码 @Dudu:你说得对,它是 Netezza。问题还是一样。 @Vamsi:数据类型是 int。 Hive 版本为 1.2.1000.2.5.3.0-37 Hive 相关标签已移除。如果您想提出与 Hive 相关的问题,请为其打开一个新帖子。 【参考方案1】:

我会尝试使用这些列 (ALL int) 加入时间维度表: MonthId StartDate EndDate 1 20150101 20150199 2 20150201 20150299 3 20150301 20150399 . . . 24 20161201 20161299

如果您只是想要一个月的第一天作为结果,则执行此操作(如果您想加入转换完整日期,则需要不同的时间表,但此示例更容易在 iPad 上编写,并且可以扩展):

select 
  t2.startdate, 
  y.* 
from yourtable y
Join timetab t1
  on y.dateAsInt between t1.StartDate and t1.EndDate
Join t2 
  On t1.monthid=t2.monthid-6

【讨论】:

以上是关于将月份添加到数字 YMD 格式的有效方法?的主要内容,如果未能解决你的问题,请参考以下文章

验证日期输入格式

检查日期是不是对选定的月份有效 Django 表单

如何将日期(“Ymd”)的输出转换为 PHP 中的数字? [复制]

tp5.1 验证规则 验证数字

从价格中去除多余零的有效方法?

将 Pandas 系列日期时间“月份”数字转换为月份文本 [重复]