如何通过SQL自动将月记录插入表中?

时间:2012-09-04 12:26:53

标签: sql ms-access select insert ms-access-2007

我尝试根据另一个表格中的说明在一个表格中生成月度记录。软件 - MS Access 2007,虽然我在这里寻找SQL解决方案。为了大大简化这个问题,我们假设下面描述了这些表:

 TaskManager:
  - DayDue
  - TaskName

 Task:
  - DateDue
  - TaskName

所以会发生的事情是TaskManager {15," Accounts due"}中可能有一个条目,所以这应该导致"帐户到期"记录在任务表中,截止日期是每月的15日。我希望它能够创建过去几个月和明年的记录。

我认为我需要做的是首先创建一个SELECT查询,该查询会为TaskManager表中的每条记录生成x条记录,并且每个月都有一个日期。之后,我执行INSERT查询,如果它们在上述SELECT查询中不存在,则将记录插入到Task表中。

我认为我可以管理INSERT查询,但我无法弄清楚如何进行SELECT查询。有人可以给我一个指针吗?

3 个答案:

答案 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究竟是什么。