使用Teradata SQL,我针对加载的“订单历史记录”表运行查询,该表涉及查找发生特定更改的最新订单。由于Order_Date以可变长度加载为VARCHAR时,我遇到了一些麻烦,但是我通过使用CASE WHEN来对齐日期的字符长度并将列强制转换为时间戳来解决了这个问题。
我现在想将此查询另存为VIEW,但是CREATE VIEW语句失败,因为日期“与定义的类型名称不匹配”。我不确定为什么在实际语句运行正常时会发生此错误?
有人可以帮我指出我所缺少的吗?
Create VIEW DB.ViewName as (
select Serv_No, Serv_Attrib, Order_Activ_Date
from (
select Serv_No, Serv_Attrib,
cast
(
CASE WHEN char_length(Order_Act_Date) = 21 AND index(order_act_Date,' ') = 10
THEN '0' || '' || Order_Act_Date
WHEN char_length(Order_Act_Date) = 20 AND index(order_act_Date,' ') = 10
THEN '0' || '' || substr(Order_Act_Date,1,10) || '0' || substr(Order_Act_Date,length(order_act_Date) - 10 + 1,10)
WHEN char_length(Order_Act_Date) = 21 AND index(order_act_Date,' ') = 11
THEN substr(Order_Act_Date,1,10) || ' 0' || substr(Order_Act_Date,length(order_act_Date) - 10 + 1,10)
WHEN Order_Act_Date IS NULL
THEN '01/01/1900 11:00:00 AM'
WHEN char_length(Order_Act_Date) = 22
THEN Order_Act_Date
END as timestamp format 'DD/MM/YYYYBHH:MI:SSBT'
) as Order_Activ_Date
from DB.Table
Qualify
Coalesce( max(Serv_Attrib) OVER (Partition By Serv_No ORDER BY ORDER_ACTIV_DATE DESC ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING
) ,Serv_Attrib || 'x') <> Serv_Attrib
) as bb
Qualify rank() over (partition by Serv_No ORDER BY Order_Activ_Date DESC) = 1
)
您可能在ODBC连接中运行它,这是由于LENGTH函数所致。LENGTH是ODBC函数,已由具有正确Teradata SQL的ODBC驱动程序代替,但仅适用于SELECT而不在DDL中。
因此,只需将其余的也更改为LENGTH
即可CHAR_LENGTH
。
顺便说一句,如果您使用的是TD14,则可以使用Oracle的TO_TIMESTAMP,它在单位数字的天/小时/分钟/秒方面更灵活。以下将强制所有情况,而无需添加前导零:
TO_TIMESTAMP(Order_Act_Date, 'DD/MM/YYYY HH:MI:SS AM')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句