是的,您绝对应该将 [BookingMonth] 存储为数字。从长远来看,将“月”列作为文本维护将是一件麻烦事,因为“八月”<“一月”和“12”<“2”。您必须至少进行一定量的杂耍才能将文本值转换为数值,因此让您自己轻松一些,只需将它们保持为数字即可。(请注意,如果您想在报告中使用它们,您始终可以将它们格式化为文本。)
至于您的搜索要求,如果用户提供 [chosenBookingYear]、[chosenBookingMonth] 和 [numberOfMonthsToBook],那么您可以使用 VBADateAdd
函数安全地派生 [endOfBookingYear] 和 [endOfBookingMonth],考虑“明年”值。 .
endOfBookingYear = Year(DateAdd("m", numberOfMonthsToBook - 1, DateSerial(chosenBookingYear, chosenBookingMonth, 1)))
...和...
endOfBookingMonth = Month(DateAdd("m", numberOfMonthsToBook - 1, DateSerial(chosenBookingYear, chosenBookingMonth, 1)))
最后,要在不循环单个行的情况下执行查找,您可以将 [BookingYear] 和 [BookingMonth] 连接在一起以使用...创建类似“2013/05”的内容...
BookingYear & "/" & Format(BookingMonth, "00")
...所以你可以创建一个 SELECT 查询,如下所示:
SELECT * FROM Payment
WHERE HouseID = chosenHouseID AND
(
(BookingYear & "/" & Format(BookingMonth, "00"))
BETWEEN (chosenBookingYear & "/" & Format(chosenBookingMonth, "00"))
AND (endOfBookingYear & "/" & Format(endOfBookingMonth, "00"))
)