HQL查询获取当年1月1日的实现及现有运行异常问题排查
问题原因
原来的代码运行异常是因为 date_format(current_date,'yyyy-01-01') 输出的是字符串类型,而 to_date(somedate) 输出的是日期类型,部分Hive版本不支持这两种类型直接比较,会触发类型转换异常或者匹配结果不符合预期。
修正方案
推荐使用Hive原生的trunc函数直接获取当年1月1日的日期值,语法更简洁,兼容性也更好:
def foo(): return " SELECT variables \ FROM bar \ WHERE \ fizz = buzz \ AND to_date(somedate) > trunc(current_date, 'YY') "
如果想要沿用原来的date_format写法,只需要把生成的字符串显式转成DATE类型即可:
def foo(): return " SELECT variables \ FROM bar \ WHERE \ fizz = buzz \ AND to_date(somedate) > to_date(date_format(current_date,'yyyy-01-01')) "
补充说明
trunc(date, 'YY')/trunc(date, 'YYYY')会直接返回输入日期对应年份的1月1日的DATE类型结果,不需要额外做格式转换- 涉及日期比较的时候,尽量保证两边的字段类型都是DATE类型,避免隐式转换带来的未知问题
内容的提问来源于stack exchange,提问作者bbweaves
相关产品推荐
相关产品推荐

