I have stopped relying on good faith in MSSQL to do string to DATE conversions. Do an explicit CONVERT
Code:
SELECT CONVERT(DATETIME, '2011-12-31', 120)
If it has always worked until now, your application may have fed it some flawed data. Check if the format is really YYYY-MM-DD. Print the string you pass to MSSQL (log file, screen, ...), to be 100% sure.