我尝试根据另一个表格中的说明在一个表格中生成月度记录。软件 - MS Access 2007,虽然我在这里寻找SQL解决方案。为了大大简化这个问题,我们假设下面描述了这些表:
TaskManager:
- DayDue
- TaskName
Task:
- DateDue
- TaskName
所以会发生的事情是TaskManager {15," Accounts due"}中可能有一个条目,所以这应该导致"帐户到期"记录在任务表中,截止日期是每月的15日。我希望它能够创建过去几个月和明年的记录。
我认为我需要做的是首先创建一个SELECT查询,该查询会为TaskManager表中的每条记录生成x条记录,并且每个月都有一个日期。之后,我执行INSERT查询,如果它们在上述SELECT查询中不存在,则将记录插入到Task表中。
我认为我可以管理INSERT查询,但我无法弄清楚如何进行SELECT查询。有人可以给我一个指针吗?
答案 0 :(得分:1)
您可以使用日历表。
INSERT INTO Task ( DateDue, TaskName )
SELECT calendar.CalDate, TaskManager.TaskName
FROM calendar, TaskManager
WHERE (((Day([CalDate]))=TaskManager.DayDue)
AND ((calendar.CalDate)<#7/1/2013#));
日历表只包含所有日期和其他相关字段,如工作日(yesno)。日历表通常非常有用。
答案 1 :(得分:0)
这是我使用Remou的Calendar表创建的解决方案。
首先创建一个Calendar表,它只包含所需范围的所有日期。只需在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日)发生变化,那么错误日期的未来记录将保留。对此的解决方案是使用调整后的日期更新所有未来记录,然后运行插入。
答案 2 :(得分:-1)
一种可能性是创建一个月表和一个年表(上一年,当前和下一个)。我可以运行一个SELECT查询,它从TaskManager表中获取Day,从Month表中选择Month,从Year表中获取Year - 我想这可能会以某种方式为单个TaskManager记录创建所需的多个记录。虽然我不确定SQL究竟是什么。