创建视图返回错误"date does not match a defined type name",但实际查询正常运行



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

最新更新