2014-02-28 31 views
0

我有一個表格,它具有以下內容:同一張表共享同一天的同一天的多個計數

ID - recid例如, 123456
已解決的日期 - ResolvedDateTime例如02/28/2014 12:00 AM(UTC)
創建日期 - CreatedDateTime例如02/28/2014 12:00 AM UTC)

我試圖確定,在一週中的某一天,當天創建和解決了多少個問題。

例如,日期範圍可以是說02/24/2014到02/28/2014。我想看到的數據類型是:

=================================================== 
    || DayOfWeek || CreatedCount || ResolvedCount || 
    ||   Mon || 51   || 12   || 
    ||   Tue || 61   || 32   || 
    ||   Wed || 53   || 90   || 
    ||   Thu || 23   || 40   || 
    =================================================== 

到目前爲止,我有以下幾點讓我回想一下本週的日子和創建的計數。這是從相反的東西,以前存在的工程:

/* Declare and set the browser timezone difference since we are manually setting a date */ 
declare @offset int; 
set @offset = (@BrowserTimezoneOffSet); 

/* This will return by the day of the week */ 
SELECT left(DATENAME(dw,DATEADD(mi,@offset,CreatedDateTime)), 3) as createddatetime 
     ,count(recid) as createdc 
FROM Incident 
WHERE DATEADD(mi,@offset,CreatedDateTime) >= @st_datein 
AND DATEADD(mi,@offset,CreatedDateTime) <= @en_datein 
GROUP BY 
    left(DATENAME(dw, DATEADD(mi,@offset,CreatedDateTime)), 3) 
    ,left(DATEPART(dw, DATEADD(mi,@offset,CreatedDateTime)), 3) 
ORDER BY 
    left(DATEPART(dw, DATEADD(mi,@offset,CreatedDateTime)), 3) 

如何得到這個查詢開始拉回解決數將是巨大的任何提示。非常感謝 - 很樂意回答任何問題或在必要時提供更多信息。

更新: 仍然絕對沒有這個運氣。 任何一個在那裏?

+0

存儲時間戳在UTC是偉大的......但是,本質上,這給了不同的結果,具體情況取決於瀏覽器說,它是?這似乎是混淆的時機:如果所有時間戳被強制到最近的開始日(UTC),那麼你和我在不同的日子可能會有相同的號碼,如果他們不是你我有一個完全不同的集合的答案。這是打算?在DST的情況下(哪個範圍可能有多個偏移!),期望的行爲是什麼?至少你的報告應該明確列出使用的偏移量,也許能夠切換。我傾向於使用UTC進行報告。 –

+0

嘿夥計。應用程序以UTC格式存儲所有內容,然後該報告用於根據時區顯示時間。時區被捕獲爲運行報告的用戶的參數 – patrick

+0

因此,週一,老闆在另一個時區休假期間運行報告(不包括他的查詢中的週末,無論如何都不會工作/降低事件)。然後,他呼籲人們嚷嚷他們爲什麼星期一和星期五的數字如此之低/在週末工作。時區轉移管理喜歡這種報告,它被稱爲「寫下那些不配額的工人」。人們應該使用同一組數字;要麼是UTC的報告,要麼是「目標」的時區(不管那是什麼)。 –

回答

1

這是非常接近你想要的。它使用子查詢爲每個日期的一行,然後總結出:

SELECT left(DATENAME(dw, thedate), 3) as thedow,, sum(created) as created, sum(resolved) as resolved 
FROM ((select DATEADD(mi, @offset, CreatedDateTime) as thedate, 1 as created, 0 as created 
     from Incident i 
     WHERE DATEADD(mi, @offset, CreatedDateTime) >= @st_datein AND DATEADD(mi, @offset, CreatedDateTime) <= @en_datein 
    ) union all 
     (select DATEADD(mi, @offset, ResolvedDateTime) as thedate, 1 as created, 0 as created 
     from Incident i 
     WHERE DATEADD(mi, @offset, CreatedDateTime) >= @st_datein AND DATEADD(mi, @offset, CreatedDateTime) <= @en_datein 
    ) 
    ) i 
GROUP BY left(DATENAME(dw, thedate), 3) 
ORDER BY left(DATEPART(dw, DATEADD(mi, @offset, thedow)), 3); 

我離開你在查詢order by。您可能會更好地擁有order by min(thedate)。如果這不起作用,還有其他可能性。

+0

嘿隊友...但這不適用於一系列的日期,對吧? – patrick

+0

如果您想要一個日期範圍,請添加一個where子句。您可以在'group by'之前添加它。不知怎的,我錯過了你的問題中的查詢。 –

+0

你是如何管理在子查詢中有兩個(不是三個,有拼寫錯誤)列的同名的? WHERE子句不應該在子查詢中嗎?而且'WHERE'子句中的日期數學可以切換到使其使用索引。你正在使用SQL Server的時間戳上的包容上限...... –

0

這是我如何解決了這個:

declare @st_date datetime; 
declare @en_date datetime; 
set @st_date = (@st_datein); 
set @en_date = (@en_datein); 

declare @offset int; 
--set @offset = (@BrowserTimezoneOffset); 
set @offset = 600; 

with daterange(dt, dow, daynum) as 
(select 
    @st_date AS [dt] 
    ,LEFT(DATENAME(dw, @st_date),3) AS [dow] 
    ,DATEPART(dw,@st_date) as [daynum] 
union all 
select 
    DATEADD(dd, 1, [dt]) as [dt] 
    ,LEFT(DATENAME(dw,DATEADD(dd,1,[dt])),3) as [dow] 
    ,DATEPART(dw,DATEADD(dd,1,[dt])) as [daynum] 
from 
    daterange 
where 
    dt <= DATEADD(dd, -1, @en_date) 
) 
select 
    dow 
    ,daynum 
    ,inc.createdc as createdcount 
    ,inr.resolvedclosedc as resolvedclosedcount 
from 
    daterange left outer join 
(select 
    left(DATENAME(dw,DATEADD(mi,@offset,CreatedDateTime)), 3) as createddatetime 
    ,count(recid) as createdc 
from 
    Incident 
where 
    DATEADD(mi,@offset,CreatedDateTime) >= @st_date 
    and DATEADD(mi,@offset,CreatedDateTime) <= @en_date 
group by 
    left(DATENAME(dw, DATEADD(mi,@offset,CreatedDateTime)), 3) 
) as inc 
on inc.CreatedDateTime = dow 
left outer join 
(select 
    left(DATENAME(dw, DATEADD(mi,@offset,ResolvedDateTime)), 3) as ResolvedDateTime 
    ,count(case when status in ('Resolved', 'Closed') then 1 end) as resolvedclosedc 
from 
    Incident 
where 
    DATEADD(mi,@offset,ResolvedDateTime) >= @st_date 
    and DATEADD(mi,@offset,ResolvedDateTime) <= @en_date 
group by 
    left(DATENAME(dw, DATEADD(mi,@offset,ResolvedDateTime)), 3) 
) as inr 
on inr.ResolvedDateTime = dow 
group by 
    dow 
    ,daynum 
    ,inr.resolvedclosedc 
    ,inc.createdc 
ORDER BY 
    daynum 
OPTION (MAXRECURSION 32767);