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)
此查询将查看约会开始时间而不计算星期五,因为我们的文档仅在星期五工作半天。有人告诉我,我们确实想要计算它们,但只有半天(第一次我被告知排除它们大声笑)。
有人可以帮我一个案例陈述,这个陈述会计算在周六12点之后没有约会的星期五半天吗?我相信它必须进入ScheduleDays=COUNT(DISTINCT(CAST(datediff(d,0,a.ApptStart) as datetime)))
。也许我们可以把星期五和之后的12个过滤器放在那里,而不是在where子句中,如果我们要使用案例的话。 ScheduleDays=COUNT(DISTINCT CASE WHEN etc
。我非常感谢你的帮助。
答案 0 :(得分: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