Ваша непосредственная проблема - отсутствующие # разделители даты, как показывал @MicSim. Однако я предлагаю вам рассмотреть другой подход для вашего предложения WHERE.
Предложение WHERE после добавления разделителей # похоже на это (с текущей датой).
Debug.Print "WHERE pdate not between #1-" & _
Format$(Now, "MMM") & "-" & Format$(Now, "YYYY") & _
"# and #20-" & Format$(Now, "MMM") & "-" & _
Format$(Now, "YYYY") & "#"
WHERE pdate not between #1-May-2011# and #20-May-2011#
Важным вопросом является то, включают ли все ваши значения pdate полночь в качестве компонента времени. (Значения даты / времени всегда включают компонент времени.) Причина, по которой это может иметь значение, заключается в том, что должно произойти в этом месяце с датой 20.05.2011 10:18:15? Ваше предложение WHERE приведет к обновлению. Но эта дата все еще 20 мая ... ты этого хочешь?
Я думаю, что меньше риска непредвиденных последствий с пересмотренным предложением WHERE.
Debug.Print "WHERE pdate < " & _
Format(DateSerial(Year(Date), Month(Date), 1), "\#yyyy-mm-dd#\") & _
" OR pdate >= " & _
Format(DateSerial(Year(Date), Month(Date), 21), "\#yyyy-mm-dd#\")
WHERE pdate < #2011-05-01# OR pdate >= #2011-05-21#
Ваш вопрос помечен как vb6. Функции DateSerial (), Year (), Month (), Date () и Format () должны быть доступны в режиме песочницы ядра базы данных. (См. Страница Microsoft о функциях режима песочницы ).
Редактировать : Спасибо @Brian Camire за это предложение.
Debug.Print "WHERE pdate < " & _
"DateSerial(Year(Date), Month(Date), 1)" & _
" OR pdate >= " & _
"DateSerial(Year(Date), Month(Date), 21)"