簡體   English   中英

SQL Server 2008計數(不同?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM