set @sql += N' select *from table where paid_date between '+@fromdate+' and '+@todate+''
This line forces SQL to convert between types (it contains different types: string and datetime). As you didn't specified how to do that convert SQL goes by the last parameter on the line, which is type of datetime! You have explicitly convert datetime variables to string...
set @sql += N' select *from table where paid_date between '''+convert(nvarchar, @fromdate, 103)+''' and '''+convert(nvarchar, @todate, 103)+''''
Also notice the quotes! It ensures that the date-strings created by CONVERT will be treated as string (enclosed by quotes)