您似乎有很多垃圾数据,所以首先您应该检查数据是否是您期望格式的有效时间戳('2011/11/15 20:58:48.041')。我们可以使用一个简单的解决方案 - 只需将所有数字替换为 '0' 并检查结果格式:
TRANSLATE(timestamp_column,'0','0123456789','0') = '0000/00/00 00:00:00.000'
如果格式是预期的格式,您应该转换为 DB2 时间戳。在 DB2 for iSeries 中,有一个自 V6R1 TIMESTAMP_FORMAT 以来的内置函数。在你的情况下,它看起来像这样:
TIMESTAMP_FORMAT('2011/11/15 20:58:48.041','YYYY/MM/DD HH24:MI:SS.NNNNNN')
所以组合的解决方案查询应该是这样的:
SELECT
CASE
WHEN TRANSLATE(timestamp_column,'0','0123456789','0') = '0000/00/00 00:00:00.000'
THEN TIMESTAMP_FORMAT(timestamp_column,'YYYY/MM/DD HH24:MI:SS.NNNNNN')
ELSE NULL
END
FROM
your_table_with_bad_data
编辑
我刚刚看到您关于提供商同意清理数据的评论。您可以使用提供的解决方案来加快处理速度并自行清理数据:
ALTER your_table_with_bad_data ADD COLUMN clean_timestamp TIMESTAMP DEFAULT NULL;
UPDATE your_table_with_bad_data
SET clean_timestamp =
CASE
WHEN TRANSLATE(timestamp_column,'0','0123456789','0') = '0000/00/00 00:00:00.000'
THEN TIMESTAMP_FORMAT(timestamp_column,'YYYY/MM/DD HH24:MI:SS.NNNNNN')
ELSE NULL
END;