2013-07-16 4 views
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 Я хочу, чтобы включить в этот день в отчетливом графеSQL Server 2008 Count (Distinct?

до сих пор у меня есть:.

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) 

Заранее благодарен!

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

Что вы имеете в виду, когда вы говорите, что ваш код «А не было» т работы "? Какие результаты вы получили? Или вы получили сообщение об ошибке? –

+0

Я имею в виду, что это только вернуло 1 встречу .. это должно было быть меньше, чем 16 для этого частного документа за этот месяц, так как 16 - это счет, прежде чем я попытался избавиться от пятнадцати дней. EDIT Я только что считал, что он должен вернуться 12. – user2588088

+1

Вы считаете уникальные результаты операторов case, единственными результатами которых могут быть 1 или 0, тогда счетчик может быть только в диапазоне от 0 до 2. – bendataclear

ответ

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)> = 12.

bendataclear указала, что вы используете отчет о случаях, который может только когда-либо возвращать 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 

ИНЕКЕ будет давать вам все дни, которые не пятница, а затем дать вам все пятниц, которые имеют час> 12.

+0

Спасибо за ваши ответы. Я верю, что у меня почти есть это; этот datepart будет очень полезен. Что я должен использовать вместо «then 1 else 0?»? – user2588088

+0

О! Это тоже может быть частью проблемы! @bendataclear выше указал, что вы используете отчетливый в случае case, который может только когда-либо возвращать 0 или 1, поэтому ваша общая сумма будет только когда-либо быть 0, 1 или 2. Если вы пытаетесь определить, в какие дни работали врачи более половины дня, вы можете просто сделать отчет в самой дате - SELECT COUNT (DISTINCT (CAST (датированный (d, 0, timestamp_value) как дата-время)). Я отредактировал ответ для размещения. –

+0

Я попробовал следующий и получил 1808 .. кричит, что я сделал что-то не так. - Фильтр на полдня и пятницу DATENAME (будний день, a.ApptStart) <> «Пятница» ИЛИ ДАТЕПАРТ (час, a.ApptStart)> 12 – user2588088