2013-07-17 59 views
1
SELECT  
    ScheduleDays = COUNT(DISTINCT(CAST(datediff(d, 0, a.ApptStart) AS datetime))) 
FROM 
    Appointments a 
WHERE 
    ApptKind = 1 AND 
    --filter on current month 
    a.ApptStart >= ISNULL(DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0),'1/1/1900') AND 
    a.ApptStart < ISNULL(DATEADD(month, DATEDIFF(month, 0, GETDATE())+1, 0),'1/1/3000')AND 
    --filter all days that aren't Friday, and then give you all Fridays that have an hour > 12. 
    DATENAME(weekday, a.ApptStart) <> 'Friday' and DATEPART(hour, a.ApptStart) > 12 AND 
    --Filter on doctor 
    a.ResourceID in (201) 

这个查询将寻找通过预约开始时间和不计星期五作为我们的文档只工作在周五半天。有人告诉我,我们要指望他们,但只(我第一次被告知要排除他们哈哈)SQL Server 2008的计数(不同呢?

有人可以请求帮助我一个案例声明,将计数周五没有预约后12noon,半天?我相信它将不得不在ScheduleDays=COUNT(DISTINCT(CAST(datediff(d,0,a.ApptStart) as datetime)))。也许我们可以把星期五和之后的12个过滤器放在那里,而不是在where子句中,如果我们打算使用case。ScheduleDays=COUNT(DISTINCT CASE WHEN etc。我真的很感谢帮助。

+1

您发布的查询返回当前的月份,其中一个医生有预约时间是不是在周五下午的天数。不计算星期五的约会,也不计算早上的约会。你是否要求提供同样预约计数的查询,但是只有在中午之前预约是在星期五,还是在其他时间的任何时间? –

+0

嗯,你可以告诉我这个SQL的新东西。我希望它能够计算所有有约会的日子。如果星期五早上只有约会(中午截止),那么我们将它算作半天。这里的想法是将文档预约的天数和计入星期五的天数返回为半天。我们将用它来为他们设定基准。 – user2588088

+0

你能否提出一个更好,更具描述性的标题?它看起来像是一个可能对其他用户有用的问题,如果因为标题而无法找到它们,那将是一种耻辱:-) – Josien

回答

3

你不能用count来真正计数一半的东西,所以这是不行的。但是,你可以用算术来做。我觉得是这样的:

select (count(distinct (case when DATENAME(weekday, a.ApptStart) <> 'Friday' 
          then cast(a.apptstart as date) 
         end) 
      ) + 
     0.5 * count(distinct (case when DATENAME(weekday, a.ApptStart) = 'Friday' 
            then cast(a.apptstart as date) 
           end) 
        ) 
     ) as ScheduleDays 

如果该文档仅在周五工作半天,我不认为你需要检查的预约时间。当然,如果你愿意,可以加入第二个count

请注意,为了计算天数,我使用了将datetime转换为date的更简单的语法。

编辑:

随着时间的检查:

select (count(distinct (case when DATENAME(weekday, a.ApptStart) <> 'Friday' 
          then cast(a.apptstart as date) 
         end) 
      ) + 
     0.5 * count(distinct (case when DATENAME(weekday, a.ApptStart) = 'Friday' and DATEPART(hour, a.ApptStart) <= 12 
            then cast(a.apptstart as date) 
           end) 
        ) 
     ) as ScheduleDays 
+0

哈哈有些人!这很有道理。如果我想添加检查时间,我会在='Friday'_________之后添加它。然后等等。DATEPART(hour,a.ApptStart)> 12。哪里适用于='星期五'和> 12? – user2588088

+0

戈登非常感谢你的帮助! – user2588088