[英]SQL Server 2008 Count(Distinct?
ApptStart
2005-02-18 10:00:00.000
2005-02-18 13:00:00.000
2005-02-18 11:00:00.000
2005-02-21 09:00:00.000
2005-02-18 15:30:00.000
2005-02-18 14:30:00.000
.
.
.
我的数据库中有一列如上所述。 我想计算给定文档在该月的约会。 星期五大多数人半天。 因此,我不想只在早上安排周五的约会。 如果约会是在下午,则在12:00:00.000之后,我想将这一天包括在内。
到目前为止,我有:
SELECT
ScheduleDays = count(distinct CONVERT(datetime, convert(char(12), a.ApptStart, 1)))
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 on doctor
a.ResourceID in (201)
当我每天数着约会时这是可行的,但是就像我说我需要排除那半天一样,所以我在考虑只查看ApptStart
的最后一个右字符,然后在内部的情况下比较x>正午。独特的计数...
我尝试了以下操作,但没有成功:
ScheduleDays = count(distinct case when (Right(a.ApptStart, 12)) > '12:00:00:000' then 1 else 0 END)
提前致谢!
编辑我尝试过:
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 with an hour > 12.
DATENAME(weekday, a.ApptStart) <> 'Friday' OR DATEPART(hour, a.ApptStart) > 12 AND
--Filter on doctor
a.ResourceID in (201)
以1808为计数
您可能希望将日期视为日期,而不是字符串。 您可以使用DATEPART
来确定某个特定的时间戳是在星期五(或时间戳的小时)上,而不必将其转换为CHAR:
datename(weekday, timestamp_value)
-返回星期五
datepart(weekday, timestamp_value)
-返回5或6,具体取决于SET DATEFIRST
的值。 ( 获取SQL 2005/2008中的星期几 )
datepart(hour, timestamp_value)
-返回小时部分
使用这些,可以通过检查datepart(weekday, timestamp_value)
= 6和datepart(hour, timestamp_value)
> = 12来测试时间戳是否在星期五中午或之后。
bentataclear指出您在案例陈述中使用的是distinct,该陈述只能返回0或1,因此您的总数将永远只有0、1或2。如果您要确定医生工作的天数超过半天,您需要选择不同的日期-
SELECT COUNT(DISTINCT(CAST(datediff(d,0,timestamp_value) as datetime)))
FROM table_name
WHERE DATENAME(weekday, timestamp_value) <> 'Friday' OR DATEPART(hour, timestamp_value) > 12
AND the rest of your filters here
那里的WHERE子句将为您提供非星期五的所有日子,然后为您提供一个小时数大于12的所有星期五。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.