I'd rather expected you to ask "why month()"? There is no need to use both month() and monthstart() here. Any one of them should work, I'm not sure why month() didn't work properly at the first place, so suggested to try another approach.
The monthstart() converts all the dates values in one month to one single date. Typically I use this in the script to create "Month and Year" field:
date(monthstart(DateField),'MMM-YY') as MonthYear
The expression above is more or less the same that you create with dual, but it is more effective - shorter, simpler, and utilizes the "natural dualism" of the date function. The only possible downsize that it is if fact a date, the first date of a month - but if you think of it, it is an additional convenience for using in expressions.