时间字段关联失败求助:Timestamp与拆分日期时间字段关联报错
解决Teradata中时间字段关联的"invalid operation on date/time"错误
你遇到的这个错误,核心是Teradata不支持直接把TIME类型通过带格式的CAST转换为INTEGER的写法。我来拆解问题并给出两种可行的解决方案:
问题根源
你原语句里的这段转换逻辑不符合Teradata语法规则:
cast(cast( a.reported_date as time(0) ) as integer format '99:99:99')
FORMAT参数仅适用于字符串与日期/时间类型的转换,不能直接用来控制数值类型的转换格式,这才触发了"invalid operation on date/time"报错。
解决方案一:将Timestamp时间部分转为匹配的整数格式
我们先把reported_date的时间部分提取为无冒号的6位字符串(比如19:58:00转为'195800'),再转成INTEGER,就能和Fault_Order_Submitted_Tm的存储格式对齐:
SELECT a.completion_date, b.Fault_Order_Completed_Dt || b.fault_order_submitted_tm AS Fault_time FROM DG.LL_FMFTMX a INNER JOIN DG.fault_order b ON a.fault_number = b.Fault_Order_Num AND CAST(a.reported_date AS DATE) = b.fault_order_submitted_dt AND CAST(TO_CHAR(a.reported_date, 'HH24MISS') AS INTEGER) = b.Fault_Order_Submitted_Tm WHERE fault_status = 'P'
解决方案二:合并日期+时间字段为Timestamp后直接关联
另一种更直观的思路是把b表的日期和整数字段合并成TIMESTAMP,直接和a.reported_date做等值匹配,避免拆分字段关联的繁琐:
SELECT a.completion_date, b.Fault_Order_Completed_Dt || b.fault_order_submitted_tm AS Fault_time FROM DG.LL_FMFTMX a INNER JOIN DG.fault_order b ON a.fault_number = b.Fault_Order_Num AND a.reported_date = TIMESTAMP( b.Fault_Order_Submitted_Dt || ' ' || TO_CHAR(b.Fault_Order_Submitted_Tm, 'FM000000') (FORMAT 'HH24:MI:SS') ) WHERE fault_status = 'P'
这里TO_CHAR(..., 'FM000000')会给不足6位的整数补前导零,再通过格式转换变成标准时间字符串,和日期拼接后转成TIMESTAMP,就能和a.reported_date直接匹配了。
额外提示
如果Fault_Order_Submitted_Tm实际存储的是带冒号的字符串(可能是你描述时的类型误差),那可以直接用TO_CHAR(a.reported_date, 'HH24:MI:SS') = b.Fault_Order_Submitted_Tm关联,无需转成整数。
内容的提问来源于stack exchange,提问作者user3901666
相关产品推荐
相关产品推荐

