SQL Server 2008计数(不同?

时间:2013-07-16 15:58:55

标签: sql sql-server-2008

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:00000之后,我希望将那一天列入不同的计数。

到目前为止,我有:

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 &GT;中午在一个独特的计数内...

我尝试了以下操作,但它不起作用:

ScheduleDays = count(distinct case when (Right(a.ApptStart, 12)) > '12:00:00:000' then 1 else 0 END)

提前致谢!

EDIT 我试过了:

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作为计数

1 个答案:

答案 0 :(得分:1)

您可能希望将日期视为日期,而不是字符串。您可以使用DATEPART确定特定时间戳是在星期五 - 或时间戳的小时 - 而不必将其转换为CHAR:


datename(weekday, timestamp_value) - 周五返回

datepart(weekday, timestamp_value) - 返回5或6,具体取决于SET DATEFIRST的值。 (Get day of week in SQL 2005/2008

datepart(hour, timestamp_value) - 返回小时部分


使用这些,您可以通过检查datepart(weekday, timestamp_value) = 6和datepart(hour, timestamp_value)&gt; = 12来测试时间戳是星期五或中午之后。

bendataclear指出你在一个只能返回0或1的case语句中使用distinct,所以你的总数只会是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子句会给你所有不是星期五的日子,然后给你一个小时的所有星期五&gt; 12。