The wildcard is not valid, you are looking for 1-3 or 1.
Code:
case $DATE in [1-9]|[12][0-9]|3[01]) break;;
*) echo Invalid date, try again >&2;;
esac
Adapting it to be stricter for February etc left as an exercise ... Maybe you could put the upper limit of the range in a variable when you read the month.
(I'd hate to use a script which prompts interactively, myself.)