你很幸运,我必须在 15 分钟内改变主意。
第 1 步:创建日历表
使用以下字段创建一个名为 Calendar 的新表
-
id:自动编号
-
Cal_Year:号码
-
Cal_Week:号码
在一个模块中,添加以下代码并执行它(F5):
Private Sub Create_Calendar_table()
Dim Y As Integer
Dim W As Integer
For Y = 2006 To 2016
For W = 1 To 52
DoCmd.RunSQL "INSERT INTO Calendar (cal_year, cal_week) VALUES (" & Y & "," & W & ")"
Next W
Next Y
End Sub
Calendar 表现在可以使用了:
ID Cal_year Cal_week
1 2006 1
2 2006 2
3 2006 3
4 2006 4
5 2006 5
and so on...
第 2 步:创建查询
请注意,我在欧洲,所以我的日期是 DD/MM。这不会影响您的结果。
我分解让你了解这个过程。
首先我们需要从日历表中的年/周创建一个日期,可以这样实现
SELECT Cal_year, Cal_week, DateAdd("ww",Cal_week,DateSerial(Cal_year,1,1)) AS thedate
FROM Calendar
Cal_year Cal_week thedate
2006 1 8/01/2006
2006 2 15/01/2006
2006 3 22/01/2006
2006 4 29/01/2006
2006 5 5/02/2006
and so on...
接下来,由于我们将处理日期范围,因此当人们的 exit_date 为 NULL 时,将 当前日期 归类很重要,如下所示:
nz(date_of_exit, Now)
字段已准备好。
然后,诀窍。
我们需要JOIN 我们的日历表和人员表,其方式将返回一个人在场的每周记录。
实现这一点的关键是ON...BETWEEN...AND
SELECT C.Cal_year, C.Cal_Week, P.pname, P.psurname, P.date_of_entry, nz(P.date_of_exit, Now) AS exit_date
FROM [Calendar] C
INNER JOIN ( SELECT [Name] AS pname, [surname] as psurname, date_of_entry, date_of_exit
FROM people
) P
ON (DateAdd("ww",C.Cal_week,DateSerial(C.Cal_year,1,1)) BETWEEN P.date_of_entry AND nz(P.date_of_exit, Now))
ORDER BY C.Cal_year, C.Cal_Week
Cal_year Cal_Week pname psurname date_of_entry exit_date
2006 1 foo bar 1/01/2006 8/01/2006
2010 1 foo1 bar1 5/01/2010 22/04/2016 13:04:39
2010 2 foo1 bar1 5/01/2010 22/04/2016 13:04:39
2010 3 foo1 bar1 5/01/2010 22/04/2016 13:04:39
2010 4 foo1 bar1 5/01/2010 22/04/2016 13:04:39
请注意,如果您需要自 2006 年以来的所有星期,即使是那些没有人在场的,只需将 INNER JOIN 更改为 LEFT JOIN
最后,我们利用前面的查询通过在日历表的年份和星期上执行GROUP BY 来计算出现次数,并且我们在WHERE 子句中指定 2015 年,否则它将计算自 2006 年以来的所有内容。这意味着很容易计算任何一年的存在。
SELECT yyyy, ww , count(*) AS cnt
FROM
(
SELECT C.Cal_year AS yyyy, C.Cal_Week AS ww
FROM [Calendar] C
INNER JOIN ( SELECT [Name] AS pname, [surname] as psurname,
date_of_entry,
date_of_exit
FROM people
) P ON (DateAdd("ww",C.Cal_week,DateSerial(C.Cal_year,1,1)) BETWEEN P.date_of_entry AND nz(P.date_of_exit, Now))
)
WHERE yyyy=2015
GROUP BY yyyy, ww
ORDER BY yyyy, ww
yyyy ww cnt
2015 1 1
2015 2 1
2015 3 1
2015 4 1
2015 5 1
2015 6 1
2015 7 1
2015 8 1
2015 9 2
2015 10 2
2015 11 2
2015 12 2
2015 13 2
2015 14 1
2015 15 1
2015 16 1
好吧,我终于花了 40 分钟......