2016-05-19 12 views
0

Ich habe einige Probleme beim Konvertieren einer Zeichenfolge (JJJJMMTTTCHIISS) in ein Datum mit TRANSLATE.DB2 - Argument 02 der Funktion TRANSLATE nicht gültig

Wenn ich eine Zeichenkette direkt benutze, dann funktioniert das ganz gut, aber wenn ich ein Feld des gleichen Datentyps verwende, varchar (14), dann wirft es den Fehler aus dem Titel.

Hier ist ein einfaches Beispiel von dem, was ich zu tun versucht:

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 

Kann einer von euch erklären, warum das nicht funktioniert? Vielen Dank.

+1

Das ändert natürlich nicht _ eine Zeichenfolge (jjjjmmddhhiiss) zu einem Datum_umwandeln, sondern stattdessen eine Zeichenkette [von Ziffern] in eine Zeichenkette umformatieren, die wie ein Zeitstempel formatiert ist [der sowohl ein Datum als auch eine Uhrzeit enthält]. Wenn der Effekt ein TIMESTAMP-Datentyp sein soll, sehen Sie sich den Kommentar zu "TIMESTAMP() direkt verwenden" an. Ansonsten: Re der Kommentar darüber, wie das Ziel mit Teilstring erreicht wurde, wurde der Ausdruck nicht gezeigt, obwohl, was auch immer verwendet wurde, gibt es wahrscheinlich einfachere Mittel; z.B. zwei nahezu identische Varianten: 'VARCHAR_FORMAT (d, 'JJJJ-MM-TT HH: MI: SS')' 'TO_CHAR (d, 'JJJJ-MM-TT HH24: MI: SS')' – CRPence

Antwort

3

Von der DB2 für i Fibel ...

to-String
Ein String, der die Zeichen, die bestimmten Zeichen in Ausdruck umgesetzt werden sollen, angibt. Diese Zeichenfolge wird manchmal genannt die Ausgabe Übersetzungstabelle. Die Zeichenkette muss ein eingebauter numerischer Wert oder eine Zeichenkette Konstante sein.

So funktioniert es nicht so, wie Sie es verwenden möchten.

Argument 2 muss ein konstanter Wert sein.

Unter der Annahme einer unterstützten Version von IBM i sollten Sie die Funktion verwenden können, um die 14-stellige Zeichenfolge direkt in den Zeitstempel zu konvertieren.

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

Danke für die Erklärung . Ich habe es am Ende mit SUBSTR manuell formatiert. – okdios

+1

@okdios, siehe den Zusatz zu meiner Antwort zur direkten Verwendung von 'TIMESTAMP()' – Charles

1

Sie cas Verwendung: TIMESTAMP_FORMAT ('20160101123059', 'YYYYMMDDHH24MISS')

Wenn Sie ein Zeichen wollen führen: cast (TIMESTAMP_FORMAT ('20160101123059', 'YYYYMMDDHH24MISS') als varchar (50))