我们有一个临时表,用于从供应商处加载原始数据。
一列用于捕获时间戳,但其数据类型为varchar(265)。数据很脏:大约有40%的时间存在垃圾数据,否则就会出现像这样的时间戳数据
2011/11/15 20:58:48.041
我必须创建一个报告,过滤掉该列的某些日期/时间戳,但是在我尝试投射它的地方,我收到错误:
db2 => select cast(loadedon as timestamp) from automation
1
--------------------------
SQL0180N The syntax of the string representation of a datetime value is incorrect. SQLSTATE=22007
解析/转换时间戳字符串需要做什么?
答案 0 :(得分:14)
DB2 timestamp的字符串格式为:
'2002-10-20-12.00.00.000000'
或
'2002-10-20 12:00:00'
您必须以这两种格式之一获取日期字符串。
即使输出有时使用12小时制(AM / PM),DB2也会以24小时制运行
所以'2002-10-20 14:49:50'对于2:49:50 PM
或'2002-10-20 00:00:00'午夜。输出将是凌晨12:00:00
答案 1 :(得分:2)
看起来你有很多垃圾数据,所以你应该检查数据是否是你期望的格式的有效时间戳(' 2011/11/15 20:58:48.041&#39 )。我们可以使用一个简单的解决方案 - 只需用' 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;
答案 2 :(得分:-7)
供应商最终同意清理他们的数据。问题解决了。