システム関数内での文字列長のあつかい(文字列操作の結果を日付型に変換する)

 テキストをタイムスタンプに直すために

db2 VALUES TIMESTAMP(CONCAT(REPLACE('2005/6/30','/','-') , ' 00:00:00'))

 と書くと

SQL0440N  互換引き数を持つタイプ "FUNCTION" の名前 "TIMESTAMP"
の許可ルーチンが見つかりませんでした。  SQLSTATE=42884

 と怒られますが、これはなぜかというと、ヒントはREPLACE関数にありました。SQLリファレンスをよく読むと

最初、2 番目、および 3 番目の引き数が VARCHAR または CHAR の場合は VARCHAR(4000) になります。 

 と書いてあります。つまりTIMESTAMPの引数の文字列長が大きすぎて怒られるというひどい話なのです。ここは

db2 VALUES TIMESTAMP(CHAR(CONCAT(REPLACE('2005/6/30','/','-') , ' 00:00:00'),20))

 のようにいったんCHAR型で文字列長を減らす処理が必要なのでした。