1
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)

当我计算每天都有约会时,这很有效,但是就像我说的那样我需要排除那半天。所以我想只查看 the 的最后一个正确的字符ApptStart并在不同的情况下比较它 x > noon数数...

我尝试了以下方法,但没有奏效:

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

4

1 回答 1

1

您可能希望将日期视为日期,而不是字符串。您可以使用 来确定特定时间戳是在星期五还是时间戳的小时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)使用这些,您可以通过检查 if = 6 和datepart(hour, timestamp_value)>= 12来测试时间戳是在星期五还是中午之后。

Bendataclear 指出,您在 case 语句中使用 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 的星期五。

于 2013-07-16T16:15:03.793 回答