2015-09-06 79 views
3

我在Netezza下面的查询运行,并得到提及的错误。错误的时间戳外部表示错误在Netezza

查询:

SELECT * FROM WORKORDER SRC 
    INNER JOIN APPOINTMENT TRG 
     ON SRC.ACCESSID = TRG.SEEKER_ID 
     AND (COALESCE(SRC.SLAEXPIRY, '') = COALESCE(TRG.SLA_EXPIRY_DATE_TS, '')) 

错误:

ERROR [HY000] ERROR: Bad timestamp external representation '' 

我可以看到有时NULLSLAEXPIRYSLA_EXPIRY_DATE_TS列尝试以下选项,没有运气虽然

SELECT * FROM WORKORDER SRC 
    INNER JOIN APPOINTMENT TRG 
     ON SRC.ACCESSID = TRG.SEEKER_ID 
     AND case when COALESCE(SRC.SLAEXPIRY, '') is not null then COALESCE(SRC.SLAEXPIRY, '') 
          else NULL end = case when COALESCE(TRG.SLA_EXPIRY_DATE_TS, '') is not null then COALESCE(TRG.SLA_EXPIRY_DATE_TS, '') 
              else NULL end 
+0

我相信有一个默认值是传递给你的时间戳列。而不是通过空间尝试传递'00 -00-00 00:00:00' – Abhis

+0

@Abhis,不幸的是在这一点上,我必须忍受现有的数据。目前在这个列中有'NULL'值 – SMPH

+0

@Ahhis,我尝试了你的解决方案,然后得到了'ERROR [HY000] ERROR:错误的时间戳外部表示'00 -00-00 00:00:00'' – SMPH

回答

1

的根本问题在于空字符串(即'')不能转换为时间戳。

TESTDB.ADMIN(ADMIN)=> select coalesce(current_timestamp, ''); 
ERROR: Bad timestamp external representation '' 

第二个问题当然是NULL不加入。无论如何,如果你想加入NULL,下面的查询应该适合你。不要期望这种基于表达式的连接有很好的性能。

SELECT * 
FROM WORKORDER SRC 
    INNER JOIN APPOINTMENT TRG 
    ON SRC.ACCESSID = TRG.SEEKER_ID 
    AND 
     (
     (
      SRC.SLAEXPIRY = TRG.SLA_EXPIRY_DATE_TS 
     ) 
     OR 
     (
      SRC.SLAEXPIRY   IS NULL 
     AND TRG.SLA_EXPIRY_DATE_TS IS NULL 
     ) 
    ) 
+0

你也可以使用'isnotfalse()'或'istrue()'函数将null与null进行比较。 –