您很幸运,我不得不改变主意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 YEnd Sub
Calendar该表现在可以使用了:
ID Cal_year Cal_week1 2006 12 2006 23 2006 34 2006 45 2006 5 and so on...
步骤2:建立查询
请注意,我在欧洲,所以我的日期是DD / MM。 这不会影响您的结果。
我会分解,以便您了解该过程。
首先,我们需要从日历表中的年/周创建一个日期,可以像这样实现
SELECt Cal_year, Cal_week, DateAdd("ww",Cal_week,DateSerial(Cal_year,1,1)) AS thedateFROM CalendarCal_year Cal_week thedate2006 1 8/01/20062006 2 15/01/20062006 3 22/01/20062006 4 29/01/20062006 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_dateFROM [Calendar] CINNER 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_WeekCal_year Cal_Week pname psurname date_of_entry exit_date2006 1 foo bar 1/01/2006 8/01/20062010 1 foo1 bar1 5/01/2010 22/04/2016 13:04:392010 2 foo1 bar1 5/01/2010 22/04/2016 13:04:392010 3 foo1 bar1 5/01/2010 22/04/2016 13:04:392010 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 cntFROM( 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=2015GROUP BY yyyy, wwORDER BY yyyy, wwyyyy ww cnt2015 1 12015 2 12015 3 12015 4 12015 5 12015 6 12015 7 12015 8 12015 9 22015 10 22015 11 22015 12 22015 13 22015 14 12015 15 12015 16 1
好吧,我终于花了40分钟…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)