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