将月份添加到数字 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 格式的有效方法?的主要内容,如果未能解决你的问题,请参考以下文章