这是我使用 Remou 的日历表想法开发的解决方案。
首先创建一个日历表,它只包含所需范围的所有日期。在 Excel 中制作日期并将其粘贴到表格中很容易。这也是一种非常可靠的方法,因为 Excel 可以正确处理现代日期范围的闰年。
构建此表后,要运行三个查询。第一个是 SELECT,它根据日期和频率选择 TaskManager 生成的每个可能的任务。此查询称为 TaskManagerQryAllOptions,并具有以下代码:
SELECT TaskManager.ID, Calendar.CalendarDate
FROM TaskManager INNER JOIN Calendar ON
TaskManager.DateDay = Day(Calendar.CalendarDate)
WHERE (TaskManager.Frequency = "Monthly")
OR (TaskManager.Frequency = "Yearly" AND
TaskManager.DateMonth = Month(Calendar.CalendarDate))
OR (TaskManager.Frequency = "Quarterly" AND
(((Month(Calendar.CalendarDate)- TaskManager.DateMonth) Mod 3) = 0));
以上大部分内容是涵盖季度日和月对可能涵盖的不同选项。下一步是另一个 SELECT 查询,它从 TaskManagerQryAllOptions 中选择日期在所需范围内的记录。此查询称为 TaskManagerQrySelect。
SELECT TaskManagerQryAllOptions.ID, TaskManager.TaskName,
TaskManagerQryAllOptions.CalendarDate
FROM TaskManagerQryAllOptions INNER JOIN TaskManager
ON TaskManagerQryAllOptions.ID = TaskManager.ID
WHERE (TaskManagerQryAllOptions.CalendarDate > Date()-60)
AND (TaskManagerQryAllOptions.CalendarDate < Date()+370)
AND (TaskManagerQryAllOptions.CalendarDate >= TaskManager.Start)
AND ((TaskManagerQryAllOptions.CalendarDate <= TaskManager.Finish)
OR (TaskManager.Finish Is Null))
ORDER BY TaskManagerQryAllOptions.CalendarDate;
最后一个查询是一个 INSERT。由于我们会经常使用这个查询,我们不希望它产生重复,所以我们需要过滤掉已经创建的记录。
INSERT INTO Task ( TaskName, TaskDate )
SELECT TaskManagerQrySelect.TaskName, TaskManagerQrySelect.CalendarDate
FROM TaskManagerQrySelect
WHERE Not Exists(
SELECT *
FROM Task
WHERE Task.TaskName = TaskManagerQrySelect.TaskName
AND Task.TaskDate = TaskManagerQrySelect.CalendarDate);
此方法的一个限制是,如果重复日期(例如每个月的 15 日)发生更改,则将保留错误日期的未来记录。对此的解决方案是使用调整后的日期更新所有未来的记录,然后运行插入。