2013-06-26 31 views
2

需要在格式YYYY-MM的日期,並應進行分組,以獲得 計數,但是當我給需求日期

group by date is says invalid 

我發現這個解決方案

誰能幫助我通過提供其他解決方案

select 
count(*) as count, 
Convert(char(10), RH.updated_datetime, 105) as date, 
SUM( 
    datediff(SECOND, 
     PRI.procedure_performed_datetime ,RH.updated_datetime 
) 
)/count(*) as average_reporting_tat 
from 
report R, 
report_history RH, 
study S, 
procedure_runtime_information PRI, 
priorities PP, 
patient P, 
"procedure" PR 

where 

RH.report_fk=R.pk and RH.pk IN ( 
    select pk from ( 
    select * from report_history where report_fk=r.pk 
) as result 
    where old_status_fk IN (21, 27) 
) AND R.study_fk = S.pk 
AND S.procedure_runtime_fk = PRI.pk 
AND PRI.procedure_fk = PR.pk 
AND S.priority_fk = PP.pk 
AND PRI.patient_fk = P.pk 
AND RH.updated_datetime >= '2012-05-01' 
AND RH.updated_datetime <= '2013-09-12' 
group by Convert(char(10), RH.updated_datetime, 105) 
+0

你可以做到這一點 SELECT dbo.fnFormatDate(GETDATE(), 'YYYY-MM') – blganesh101

+1

你可以試試這個以及....左(CONVERT(CHAR(10),RH.updated_datetime,126) ,7) –

回答

4

我認爲這樣做最簡單的方法如下:

CONVERT(VARCHAR(7), RH.updated_datetime, 126) 

但是,我從來沒有在應用層之前將日期轉換爲字符串的粉絲,所以如果是我,我會用把它作爲一個日期格式,但轉換每個日期的第一個月:

DATEADD(MONTH, DATEDIFF(MONTH, 0, RH.updated_datetime), 0) 

這意味着你的應用程序收到列作爲一個日期,可以被操縱爲日期,排序作爲日期等,然後如果你確實想將其顯示爲yyyy-mm你可以在最後一分鐘做的格式。

0

試試這個:

select count(*) as count,Convert(char(10), RH.updated_datetime, 105) as date, 
      (CAST(MONTH(RH.updated_datetime) AS VARCHAR(2)) + '-' +    CAST(YEAR(RH.updated_datetime) AS VARCHAR(4))), 
     SUM(datediff(SECOND,PRI.procedure_performed_datetime ,RH.updated_datetime))/count(*) as average_reporting_tat 
from 
     report R, 
     report_history RH, 
     study S, 
     procedure_runtime_information PRI, 
     priorities PP, 
     patient P, 
     "procedure" PR 
where 
     RH.report_fk=R.pk and RH.pk IN (select pk from (select * from report_history where report_fk=r.pk) as result where old_status_fk IN (21, 27)) 
     AND R.study_fk = S.pk 
     AND S.procedure_runtime_fk = PRI.pk 
     AND PRI.procedure_fk = PR.pk 
     AND S.priority_fk = PP.pk 
     AND PRI.patient_fk = P.pk 
     AND RH.updated_datetime >= '2012-05-01' 
     AND RH.updated_datetime <= '2013-09-12' 
group by (CAST(MONTH(RH.updated_datetime) AS VARCHAR(2)) + '-' + CAST(YEAR(RH.updated_datetime) AS VARCHAR(4))),date 
0

嘗試這一個 -

SELECT 
     [count] = COUNT(1) 
    , [date] = CAST(YEAR(RH.updated_datetime) AS VARCHAR(4)) + '-' + CAST(MONTH(RH.updated_datetime) AS VARCHAR(2)) 
    , average_reporting_tat = SUM(DATEDIFF(SECOND, PRI.procedure_performed_datetime ,RH.updated_datetime))/COUNT(1) 
FROM dbo.report R 
JOIN dbo.report_history RH ON RH.report_fk=R.pk 
JOIN dbo.study S ON R.study_fk = S.pk 
JOIN dbo.procedure_runtime_information PRI ON S.procedure_runtime_fk = PRI.pk 
JOIN dbo.priorities PP ON S.priority_fk = PP.pk 
JOIN dbo.patient P ON PRI.patient_fk = P.pk 
JOIN dbo.[procedure] PR ON PRI.procedure_fk = PR.pk 
WHERE RH.pk IN ( 
     SELECT pk 
     FROM report_history 
     WHERE report_fk=r.pk AND old_status_fk IN (21, 27) 
    ) 
    AND RH.updated_datetime BETWEEN '2012-05-01' AND '2013-09-12' 
GROUP BY CAST(YEAR(RH.updated_datetime) AS VARCHAR(4)) + '-' + CAST(MONTH(RH.updated_datetime) AS VARCHAR(2))