【问题标题】:Count day of week occurances计算星期几的发生次数
【发布时间】:2013-12-20 11:27:22
【问题描述】:

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

例如,在这个例子中,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 

【问题讨论】:

    标签: sql sql-server-2005


    【解决方案1】:

    我认为你需要这个:

    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 数据类型。

    编辑:

    您可以使用datename(dw, Attendance) = 'Sunday',而不是datepart(dw, Attendance) = 6

    【讨论】:

    • 太棒了。其他人多次计算同一天,但这只是每天计算一次,这是我需要的。谢谢。
    • 6Sunday 的常量吗?那是正确的吗?设置了什么语言?
    • 'datename(dw, Attendance) = 'Sunday'' 是正确的。 'datepart(dw, Attendance) = 6' 在某些情况下不会返回正确的金额。
    【解决方案2】:

    试试这个

    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
    

    【讨论】:

      【解决方案3】:

      看看这个例子,它也可以工作:

      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 将使用表扫描创建一个执行计划,而忽略任何可以加快查询速度的索引!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-09
        • 1970-01-01
        相关资源
        最近更新 更多