计算星期几出现的次数

时间:2013-12-20 02:09:34

标签: sql sql-server-2005

我有一个俱乐部成员名单以及他们参加俱乐部的日期时间。他们可以在一天内多次参加俱乐部。我需要知道每个成员在一段时间内参加了多少个星期日(无论在一个星期天内多少次)。我有一张表格,列出每个出席人数,由会员编号和出勤日期时间组成。

例如,在这个例子中,13/1和20/1是星期日

MEMBER                 ATTENDANCE

12345                  13/1/13 09:00

12345                  13/1/13 15:00

12345                  14/1/13 08:00

56789                  13/1/13 10:00

56789                  13/1/13 15:00

56789                  13/1/13 21:00

56789                  14/1/13 10:00

56789                  20/1/13 09:00

24680                  14/1/13 08:00

24680                  15/1/13 07:00

理想情况下,我希望看到这个回复:

MEMBER                 # OF SUNDAYS

12345                  1

56789                  2

24680                  0 

3 个答案:

答案 0 :(得分:2)

我认为你需要这个:

select Member,
       count(distinct dateadd(day, datediff(day, 0, Attendance), 0)) as NumberOfSundays
from t
where datepart(dw, Attendance)  = 6  
group by Member ;

复杂的计数确实在做:

count(distinct cast(Attendance as date))

但SQL Server 2005不支持date数据类型。

编辑:

您可以使用datepart(dw, Attendance) = 6

代替datename(dw, Attendance) = 'Sunday'

答案 1 :(得分:0)

试试这个

SELECT MEMBER,
 SUM(CASE DATENAME(dw,ATTENDANCE) WHEN 'Sunday' THEN 1 ELSE 0 END) As [# OF SUNDAYS]
FROM   MemberTable
WHERE  ATTENDANCE between [YourStartDateAndTime] AND [YourEndDateAndTime] -- replace [YourStartDateAndTime] AND [YourEndDateAndTime] with your value or variable
GROUP BY MEMBER

答案 2 :(得分:0)

看一下这个例子,它也可以起作用:

select Member
     , count( case when datepart( dw, Attendance ) = 6 then 1 else 0 end ) NumberOfSundays
  from YourTable
 where Attendance between '2013-01-13' and '2013-01-20'
 group by Member

避免在where子句上使用“修改字段原始值”的函数。通过这样做,SQL Server将使用表扫描创建执行计划,忽略任何可以加快查询速度的索引!