DB2 - Аргумент 02 функции TRANSLATE недействителен

У меня возникли проблемы с преобразованием строки (yyyymmddhhiiss) в дату с помощью TRANSLATE.

Если я использую строку напрямую, она работает отлично, но когда я использую поле с точно таким же типом данных, varchar (14), оно выдает ошибку из заголовка.

Вот базовый пример того, что я пытаюсь сделать:

WITH test_table AS (
    SELECT '20160101123059' AS d FROM SYSIBM.SYSDUMMY1
)
SELECT d
       , translate('ABCD-EF-GH IJ:KL:MN', d, 'ABCDEFGHIJKLMN')
       , translate('ABCD-EF-GH IJ:KL:MN', '20160101123059','ABCDEFGHIJKLMN')
  FROM test_table

Кто-нибудь из вас может объяснить, почему это не работает? Спасибо.


person okdios    schedule 19.05.2016    source источник
comment
Это, конечно, не преобразование строки (yyyymmddhhiiss) в дату, а вместо этого переформатирование строки [цифр] в строку, отформатированную как временная метка [которая включает как дату, так и время]. Если эффект должен быть типом данных TIMESTAMP, посмотрите комментарий, используя TIMESTAMP () напрямую. В противном случае: при комментарии о том, как цель была достигнута с помощью подстроки, выражение не было показано, хотя, что бы ни использовалось, вероятно, есть более простые средства; например два почти идентичных варианта: VARCHAR_FORMAT(d, 'YYYY-MM-DD HH:MI:SS') TO_CHAR(d, 'YYYY-MM-DD HH24:MI:SS')   -  person CRPence    schedule 29.05.2016


Ответы (2)


Из руководства по DB2 for i ...

to-string
Строка, определяющая символы, в которые должны быть преобразованы определенные символы в выражении. Эту строку иногда называют таблицей преобразования вывода. Строка должна быть любой встроенной числовой или строковой константой.

Так что это не сработает так, как вы пытаетесь его использовать.

Аргумент 2 должен быть постоянным значением.

Предполагая, что выпуск IBM i поддерживается, вы должны иметь возможность использовать функцию timestamp() для преобразования 14-символьной строки непосредственно в метку времени.

select timestamp('20160101123059')
from sysibm.sysdummy1             
person Charles    schedule 19.05.2016
comment
Спасибо за объяснение. Я закончил форматирование вручную с помощью SUBSTR. - person okdios; 19.05.2016
comment
@okdios, см. дополнение к моему ответу об использовании TIMESTAMP() напрямую - person Charles; 25.05.2016

Вы можете использовать: TIMESTAMP_FORMAT ('20160101123059', 'YYYYMMDDHH24MISS')

Если вы хотите, чтобы результат был char: cast (TIMESTAMP_FORMAT ('20160101123059', 'YYYYMMDDHH24MISS') as varchar (50))

person Esperento57    schedule 09.07.2016