hive 查询teradata到配置单元

tzdcorbm  于 2023-02-04  发布在  Hive
关注(0)|答案(2)|浏览(227)

我有这个teradata查询,但当我在hive上运行它时,它不支持

CAST(DATE '1900-01-01'+CAST( 999999999 - TRIM(BASM_DATE) AS INTEGER)  
AS DATE) AS BASM_DATE

错误

Error while compiling statement: FAILED: SemanticException line 
0:undefined:-1 Wrong arguments 'BASM_DATE': No matching method for class 
org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPDTIPlus with (date, 
int)

你们能告诉我要修复哪一部分以及查询是什么吗?
谢谢你。

laik7k3q

laik7k3q1#

您需要使用date_add(dt,num)
请使用下面的SQL -

date_add( '1900-01-01',  999999999 - cast( TRIM(BASM_DATE) as INT) ) AS BASM_DATE

我假设BASM_DATE是一个字符串列,并使用TRIM尝试删除尾随或前导空格。

vi4fp9gy

vi4fp9gy2#

Teradata SQL依赖于围绕TRIM发生的两个隐式转换。
首先使用默认格式将BASM_DATE隐式转换为VARCHAR,然后应用TRIM,再将该字符串隐式转换为FLOAT,然后执行浮点减法,最后将结果显式转换为INTEGER。然后将该天数与1900-01-01日期相加,然后执行从DATE到DATE的冗余CAST。(实际上没有理由在这里使用FLOAT,这只是Teradata用于隐式数值转换的类型。)在Teradata中给出相同结果的更好、更清楚的选择是:

DATE'1900-01-01'+(999999999 - CAST(TO_CHAR(BASM_DATE,'YYYYMMDD') AS INTEGER) AS BASM_DATE

因此,Hive的等价形式为:

date_add('1900-01-01',999999999 - cast(date_format(BASM_DATE,'yyyyMMdd') AS INT)) AS BASM_DATE

或者可以更有效地使用

date_add('1900-01-01',999999999 - year(BASM_DATE)*10000 - month(BASM_DATE)*100 - day(BASM_DATE)) AS BASM_DATE

相关问题