转换为时间戳的问题

时间:2016-03-11 13:09:22

标签: timestamp teradata

我的时间戳列有一个问题。以下查询工作正常:

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然后再次转换为时间戳(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

任何人都可以提供帮助。

由于

1 个答案:

答案 0 :(得分:1)

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

SRC.TXN_DT的数据类型是DATE还是INT? 我认为CHARACTER_LENGTH(TO_CHAR(SRC.TXN_DT))永远不会返回7,应始终为10(至少与THEN中使用的格式相符。

并且没有理由使用CASE进行第二次SRC.TXN_TM=0。无论是零还是非零,都应用相同的格式。

你能否展示一些实际价值,以及为什么你认为你不能简单地连接和...投?

根据评论进行编辑:

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