使用 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')