转换为时间戳的问题
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'))
我有一个时间戳问题 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'))