转换为时间戳的问题

Issue with converting to timestamp

我有一个时间戳问题 column.The 下面的查询工作正常:

SEL

CASE WHEN CHARACTER_LENGTH(TO_CHAR(SRC.TXN_DT))=7 THEN CAST(SRC.TXN_DT AS DATE FORMAT 'MM/DD/YYYY') ELSE  CURRENT_DATE END
||' '|| (CASE WHEN SRC.TXN_TM=0 THEN '00:00:00' ELSE  (SRC.TXN_TM (FORMAT '99:99:99')) END)   FROM TU_82933_L_ZA_CCDB .T_SF_INT SRC

但是,当我尝试将整个内容转换为 varchar 然后再次转换为 timestamp(0) 时,它给出了无效的时间戳。我检查了我的数据,没有更多的不良记录。

SEL
CAST(
CAST(
CASE WHEN CHARACTER_LENGTH(TO_CHAR(SRC.TXN_DT))=7 THEN CAST(SRC.TXN_DT AS DATE FORMAT 'MM/DD/YYYY') ELSE  CURRENT_DATE END
||' '|| (CASE WHEN SRC.TXN_TM=0 THEN '00:00:00' ELSE  (SRC.TXN_TM ( FORMAT '99:99:99')) END)   AS VARCHAR(20)) AS TIMESTAMP(0)  FORMAT 'YYYY-MM-DDBHH:MI:SS')
FROM TU_82933_L_ZA_CCDB .T_Q17020_Q90TXNO_OAS_SF_INT SRC

谁能帮忙。

谢谢

您混合了不同的日期格式,'MM/DD/YYYY''YYYY-MM-DD'

SRC.TXN_DT 的数据类型是什么,是 DATE 还是 INT? 我认为 CHARACTER_LENGTH(TO_CHAR(SRC.TXN_DT)) 永远不会 return 7,应该始终是 10(至少与您在 THEN 中使用的格式匹配。

并且没有理由使用 SRC.TXN_TM=0 进行第二个 CASE。它是零还是非零并不重要,因为您应用相同的格式。

你能展示一些实际值吗?为什么你认为你不能简单地连接和转换?

根据评论进行编辑:

1160229 是 Teradata 中日期的(愚蠢的)内部存储:

2016-02-29             =  1160229

(year - 1900) * 10000  =  1160000
+ month * 100            +    200
+ day                    +     29

如果两列都是 INT,则转换为时间戳的最有效方法是

CAST(CAST(TXN_DT AS DATE) AS TIMESTAMP(0))
+ CAST(TRIM(TXN_TM (FORMAT '99:99:99')) AS INTERVAL HOUR TO SECOND(0)) 

但是你的方法应该也有效,如果它失败了,那就是错误的数据,这就是将日期和时间存储为整数的惩罚:)

如果您不进行计算,您可以简单地转换为一个看起来像时间戳的字符串:

(TXN_DT + 19000000 (FORMAT '9999-99-99')) || (TXN_TM (FORMAT 'Z99:99:99'))