Conversions varchar to datetime and back are the worst cpoosible conversions from performance point of view.
They may be very comfortable for a human eye, so keep them where they belong - in UI and reporting interfaces.
The correct solution was posted at the beginning:
select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm, 0, getdate() )+1, 0))
Every other one is a "second best".
_____________
Code for TallyGenerator