我的时间戳列有一个问题。以下查询工作正常:
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
任何人都可以提供帮助。
由于
答案 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'))