Добавьте локальную таблицу с именем YrMos, используя следующий код, корректируя годы начала / окончания по мере необходимости (примечание: я использую RunSQL здесь только потому, что он независим от DAO / ADO; есть лучшие альтернативы, специфичные для DAO и ADO) :
Sub CreateYrMos()
Const StartYear = 1950
Const EndYear = 2050
Dim Y As Integer, M As Integer
DoCmd.SetWarnings False
DoCmd.RunSQL "CREATE TABLE YrMos " & _
"(MoStart DATE CONSTRAINT MoStartIndex PRIMARY KEY, " & _
" MoEnd Date CONSTRAINT MoEndIndex UNIQUE, " & _
" Yr Integer, Mo Integer, DaysInMo Integer, " & _
" CONSTRAINT YrMoIndex UNIQUE (Yr, Mo))"
For Y = StartYear To EndYear
For M = 1 To 12
DoCmd.RunSQL "INSERT INTO YrMos (MoStart, MoEnd, Yr, Mo, DaysInMo) " & _
"VALUES (#" & DateSerial(Y, M, 1) & "#, #" & DateSerial(Y, M + 1, 0) & "#, " & Y & ", " & M & ", " & Day(DateSerial(Y, M + 1, 0)) & ")"
Next M
Next Y
DoCmd.SetWarnings True
End Sub
Как только вы создали таблицу, используя приведенный выше код, фактический запрос становится тривиальным:
SELECT YrMos.*
FROM YrMos
WHERE MoStart BETWEEN #1/1/2010# AND #5/1/2010#
Я храню локальную копию этой таблицы (с соответствующим диапазоном лет для моих нужд) в нескольких моих приложениях доступа. Я считаю, что это гораздо более эффективный и практичный подход, чем другие, более «элегантные» решения.