Warum so kompliziert?
Ein Timestamp wird in der Variablen als CHAR(22) im ISO-Format gespeichert.
Dieses brauchst du dann nur per Redefine mit Zoned-Feldern zu deklarieren und kannst deinen Code um ganz viel kürzen:

dcl-ds TSConv;
dsTimestamp timestamp;
dsYear zoned(2) pos(1);
dsMonth zoned(2) pos(4);
....
chYear char(2) pos(1);
chMonth char(2) pos(4);
....
end-ds;

Damit kannst du den ganzen %subdt()-Kram abschaffen.
Das Ganze gilt auch z.B. für ISO-Date und ISO-Time.