【问题标题】:DB2 The syntax of the string representation of a datetime value is incorrectDB2 日期时间值的字符串表示的语法不正确
【发布时间】:2012-01-23 19:20:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: casting timestamp db2


    【解决方案1】:

    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

    或 '2002-10-20 00:00:00' 表示午夜。输出将是 12:00:00 AM

    【讨论】:

    • @Chris:那么你将不得不用一种允许 SQL 的语言编写一个转换程序。
    【解决方案2】:

    您似乎有很多垃圾数据,所以首先您应该检查数据是否是您期望格式的有效时间戳('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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 2020-10-05
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      相关资源
      最近更新 更多