2016-05-19 2 views
0

У меня возникли проблемы с преобразованием строки (yyyymmddhhiiss) в дату с использованием TRANSLATE.DB2 - Аргумент 02 функции 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 

Может один из вас объяснить, почему это не работает? Благодарю.

+1

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

ответ

3

Из DB2 для руководства я ...

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

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

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

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

select timestamp('20160101123059') 
from sysibm.sysdummy1    
+0

Спасибо за объяснение , Я закончил форматирование его вручную с помощью SUBSTR. – okdios

+1

@okdios, см. Дополнение к моему ответу об использовании 'TIMESTAMP()' непосредственно – Charles

1

Вы саз использования: TIMESTAMP_FORMAT ('20160101123059', 'yyyymmddhh24miss')

Если вы хотите голец привести: бросок (TIMESTAMP_FORMAT ('20160101123059', 'yyyymmddhh24miss'), как VARCHAR (50))