2016-11-05 306 views
0

我想通过TERADATA BTEQ执行sql并获取下面的错误。Teradata BTEQ - 无效的时间戳问题

但是,在Teradata SQL助手中执行相同的SQL运行良好。

WHERE S_ORDER_ITEM.LAST_UPD BETWEEN CAST((('20050614' (DATE, FORMAT 'YYYY-MM-DD')) -1 (CHAR(10)))|| ' ' || '22:00:01' AS TIMESTAMP(0)) AND CAST((('20050614' (DATE, FORMAT 'YYYY-MM-DD')) (CHAR(10)))|| ' ' || '22:00:00' AS TIMESTAMP(0)) 
*** Failure 2666 Invalid date supplied for S_ORDER_ITEM.LAST_UPD. 

回答

0

该错误消息表示S_ORDER_ITEM.LAST_UPD不是日期/时间戳(炭?)和自动类型转换到一个时间戳失败由于恶劣的数据。

这部分'20050614' (DATE, FORMAT 'YYYY-MM-DD')不应该工作,因为该字符串不符合格式。

没有必要将字符串转换为日期,因为使用标准SQL DATE '2005-06-14'来推荐写入日期文字的方法更简单且更短。

如果日期实际上是知道你写的更好

BETWEEN TIMESTAMP '2005-06-13 22:00:01' 
    AND TIMESTAMP '2005-06-14 22:00:00' 

否则不会转换为/从字符串,使用日期时间计算,而不是:

BETWEEN Cast(DATE '2005-06-14' AS TIMESTAMP(0)) - INTERVAL '01:59:59' HOUR TO SECOND 
    AND Cast(DATE '2005-06-14' AS TIMESTAMP(0)) + INTERVAL '22:00:00' HOUR TO SECOND 

编辑:

如果您无法更改您需要应用另一个FORMAT的输入格式:

BETWEEN Cast((('20050614' (DATE, Format 'YYYYMMDD')) -1 (Format 'yyyy-mm-dd')) || ' ' || '22:00:01' AS TIMESTAMP(0)) 
    AND Cast((('20050614' (DATE, Format 'YYYYMMDD')) (Format 'yyyy-mm-dd')) || ' ' || '22:00:00' AS TIMESTAMP(0)) 
+0

S_ORDER_ITEM.LAST_UPD是TIMESTAMP(0)数据类型,我的输入日期格式为YYYYMMDD(不超过)。您可以修改答案 –

+0

我已将日期格式从YYYYMMDD格式转换为YYYY-MM-DD格式,然后应用您的解决方案。有效。 –