O dia 31 de setembro não é uma data, então o SQL não pode convertê-lo em uma.
Como um aparte, você deve codificar datas em um formato inespecífico de cultura (aaaaMMdd).
01/08/2012
pode converter para 1º de agosto no seu servidor, mas rodar em outro e pode ser 8 de janeiro. 20120801 será convertido para 1º de agosto em todos máquinas. Além disso, por que você está convertendo datas para
NVARCHAR
? Você está removendo qualquer benefício dos índices que possui e também realizando conversões implícitas e explícitas desnecessárias. Assumindo MESSAGEINSERTDATE
é uma coluna DATETIME que você pode usar WHERE MESSAGEINSERTDATE BETWEEN '20120801' AND '20120930'
Se você precisar remover a hora de
MESSAGEINSERTDATE
usar CAST(MESSAGEINSERTDATE AS DATE)