2013-08-13 4 views
0

NEWBIE на работе! Я пытаюсь создать простое резюме, которое подсчитывает количество посещений клиентов и групп по 1) дата и 2) часа, но выводит их:Нужно сортировать по дате, затем Час, затем выводить дату, текст День недели, диапазон часов SQL Server 2008 R2

Date   Day of Wk Hour #visits 
8/12/2013  Monday  0   5 
8/12/2013  Monday  1   7 
8/12/2013  Monday  6  10 
8/13/2013  Tuesday  14  25 
8/13/2013  Tuesday  16  4 

Мы на военное время, поэтому 14 = 2:00 вечера

Select  
    TPM300_PAT_VISIT.adm_ts as [Date] 
    ,TPM300_PAT_VISIT.adm_ts as [Day of Week] 
,TPM300_PAT_VISIT.adm_ts as [Hour] 
,count(TPM300_PAT_VISIT.vst_ext_id) as [Total Visits] 
From 
    TPM300_PAT_VISIT 
Where 
    TPM300_PAT_VISIT.adm_srv_cd='22126' 
and TPM300_PAT_VISIT.adm_ts between '07-01-2013' and '08-01-2013' 
Group by 
    cast(TPM300_PAT_VISIT.adm_ts as DATE) 
    ,datepart(weekday,TPM300_PAT_VISIT.adm_ts) 
    ,datepart(hour,TPM300_PAT_VISIT.adm_ts) 
Order by  
    CAST(TPM300_PAT_VISIT.adm_ts as DATE) 
    ,DATEPART(hour,TPM300_PAT_VISIT.adm_ts) 
+1

* В военное время вы в основном имеете в виду ** Мировые стандартные 24-часовые ** часы, которые почти весь мир - за исключением США - использует, righT? –

+0

Вы показали нам полученный результат, но какой результат вы ожидаете и как они отличаются? – Rikalous

+0

Вы показали запрос, который (в то время как грубый) выглядит так, как будто он может выполнить задание - можете ли вы объяснить, какие проблемы у вас с ним? Кроме того, можете ли вы рассказать нам, какие диапазоны дат находятся в середине запроса? К сожалению, '' 07 -01-2013'' означает разные вещи для разных людей. –

ответ

0

Это должно решить проблему:

; With Streamlined as (
    SELECT 
     DATEADD(hour,DATEDIFF(hour,'20010101',adm_ts),'20010101') as RoundedTime, 
     vst_ext_id 
    from 
     TPM300_PAT_VISIT 
    where 
     adm_srv_cd='22126' and 
     adm_ts >= '20130701' and 
     adm_ts < '20130801' 
) 
Select 
    CONVERT(date,RoundedTime) as [Date], 
    DATEPART(weekday,RoundedTime) as [Day of Week], 
    DATEPART(hour,RoundedTime) as [Hour], 
    count(vst_ext_id) as [Total Visits] 
From 
    Streamlined 
Group by 
    RoundedTime 
Order by  
    CONVERT(date,RoundedTime), 
    DATEPART(hour,RoundedTime) 

в КТР (Streamlined) 's выберите список, мы пол каждый adm_ts значение вниз до ближайшего часа, используя DATEADD/DATEDIFF. Это упрощает последующую группировку.

Мы также указать полуоткрытого интервала для даты и времени, сравнения, который убеждается мы включаем все в июле (в том числе вещи, которые произошли в 23: 59: 59.997) в то время как за исключением событий, которые происходили в полночь на 1 августа. Это часто правильный тип сравнения для использования при работе с непрерывными данными (поплавки, время и т. Д.), Но означает, что вам нужно отказаться от BETWEEN.

Я также указываю даты как YYYYMMDD, который является безопасным, недвусмысленным форматом. Ваш первоначальный запрос можно было бы интерпретировать как с 7 января по 8 января, либо с 1 июля по 1 августа, в зависимости от настроек любой учетной записи, которую вы используете для подключения к SQL Server. Еще лучше, если эти даты будут предоставлены каким-либо другим (не SQL-кодом) кодом, они должны были быть переданы как datetime s в первую очередь, чтобы избежать любых проблем с форматированием.

+0

Спасибо - это довольно близко к тому, что я хочу для вывода. Могу ли я помещать оператор case, который будет преобразовывать числовой День недели в Word? т.е. 1 = Sun 2 = Mon 3 = Tue. Будет ли оператор case действовать в предложении select? – user2611375

+0

@ user2611375 - вы можете использовать ['DATENAME()'] (http://technet.microsoft.com/en-us/library/ms174395.aspx) вместо 'DATEPART()', и это вернет полное имя. Это зависит от вас, если вы затем оберните это в 'SUBSTRING()' или 'LEFT()', чтобы уменьшить его до 3 символов. –

+0

Я получил это. Еще один вопрос - когда вы используете инструкцию CASE, не можете ли вы использовать «КОГДА <7 ТОГДА» НОЧЕЙ КОГДА> = 19 ТОГДА «НОЧИ» ELSE «ДНИ» КОНЕЦ ». Я попробовал это, и это дало мне ошибку на знаке <. – user2611375