DB2 Синтаксис строкового представления значения даты и времени неверен - PullRequest
2 голосов
/ 19 декабря 2011

У нас есть промежуточная таблица, которая используется для загрузки необработанных данных от наших поставщиков.

Один столбец используется для захвата метки времени, но его тип данных - 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 ]

14 голосов
/ 19 декабря 2011

Формат строки для метки времени DB2 : либо

'2002-10-20-12.00.00.000000'

или

'2002-10-20 12:00:00'

Вы должны получить строку даты в любом из этих форматов.

Кроме того, DB2 работает на 24-часовых часах, хотя иногда в выходных данных используются 12-часовые часы (AM / PM)

Итак, '2002-10-20 14:49:50' За 14:49:50 PM

Или '2002-10-20 00:00:00' Для полуночи. Выход будет 12:00:00 AM

2 голосов
/ 23 февраля 2016

Кажется, что у вас много мусорных данных, поэтому прежде всего вам следует проверить, являются ли данные действительной отметкой времени в том формате, который вы ожидаете ('2011/11/15 20: 58: 48.041').Мы могли бы использовать простое решение - просто замените все цифры на «0» и проверьте формат результата:

TRANSLATE(timestamp_column,'0','0123456789','0') = '0000/00/00 00:00:00.000'

Если формат является ожидаемым, вы должны преобразовать в метку времени DB2.В DB2 для 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

EDIT

Я только что увидел ваш комментарийэтот поставщик согласился очистить данные.Вы можете использовать предоставленное решение для ускорения процесса и очистки данных самостоятельно:

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;
0 голосов
/ 28 декабря 2011

Поставщики наконец согласились очистить свои данные. Проблема решена.

...