DB2日期时间值的字符串表示形式的语法不正确

时间:2011-12-19 17:33:35

标签: casting timestamp db2

我们有一个临时表,用于从供应商处加载原始数据。

一列用于捕获时间戳,但其数据类型为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

解析/转换时间戳字符串需要做什么?

3 个答案:

答案 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)

供应商最终同意清理他们的数据。问题解决了。