31 września nie jest datą, więc SQL nie może przekonwertować jej na taką datę.
Na marginesie powinieneś zakodować daty w niespecyficznym formacie kulturowym (rrrrMMdd). 01/08/2012 może przekonwertować się na 1 sierpnia na twoim serwerze, ale działać na innym i może to być 8 stycznia. 20120801 zostanie przekonwertowany na 1 sierpnia wszystkich maszyny.
Dodatkowo Dlaczego konwertujesz daty na NVARCHAR? ? Usuwasz wszelkie korzyści z posiadanych indeksów, a także przeprowadzasz niepotrzebne konwersje niejawne i jawne. Zakładając, że MESSAGEINSERTDATE to kolumna DATETIME, której możesz po prostu użyć
WHERE MESSAGEINSERTDATE BETWEEN '20120801' AND '20120930'
Jeśli chcesz usunąć czas z MESSAGEINSERTDATE użyj
CAST(MESSAGEINSERTDATE AS DATE)