Veja o valor:
'2013-31-01 16:00:40'
Isso está tentando usar um mês de 31.
Não está claro se isso significa apenas que seus dados de teste estão errados ou se você precisa alterar estas linhas:
SELECT SUBSTRING(DATE,3,2) FROM db.test_table INTO LMONTH;
SELECT SUBSTRING(DATE,1,1) FROM db.test_table INTO LDAY;
para:
SELECT SUBSTRING(DATE,1,2) FROM db.test_table INTO LMONTH;
SELECT SUBSTRING(DATE,4,2) FROM db.test_table INTO LDAY;
Observe a mudança de 1 para 2 para a substring começando em 1 de qualquer maneira, e a mudança da segunda posição inicial de 3 para 4. Você quer valores de mês e dia de dois dígitos, certo? Se seu formato de dados for realmente D/M/YYYY (ou seja, usando apenas dois dígitos quando necessário), você não poderá usar posições de substring fixas.