我正在尝试通过TERADATA BTEQ执行sql并获得以下错误。
但是在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 :(得分:0)
错误消息表明S_ORDER_ITEM.LAST_UPD
不是日期/时间戳(char?),并且由于数据错误而导致时间戳的自动类型转换失败。
此部分'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
编辑:
如果您无法更改输入格式,则需要应用另一种格式:
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))