2012-01-10 94 views
-1

我正在在MSSQL存儲過程中,我想我的結果由間隔一天,我不確定組,如果這是正確的,但:如何在特定時間間隔內正確地GROUP BY日期時間列?

(這是一個部分)

INSERT @Results 
    (
     [Day], 
     [Month], 
     [Year], 
     [Result] 
    ) 
    SELECT 
     DATEPART(DD, DATEADD(MI, @GmtOffset, EventDate)), 
     DATEPART(MM, DATEADD(MI, @GmtOffset, EventDate)), 
     DATEPART(YY, DATEADD(MI, @GmtOffset, EventDate)), 
     Result = CASE WHEN @Metric = 'Take Rate' THEN NULL ELSE COUNT(*) END 
    FROM BundleEvent 
    WHERE BundleEventTypeId = CASE WHEN @Metric = 'Take Rate' THEN @TypeTakeId ELSE @BundleEventTypeId END 
     AND EventDate >= @StartTime AND EventDate <= @EndTime 
    GROUP BY 
     DATEPART(YY, DATEADD(MI, @GmtOffset, EventDate)), 
     DATEPART(MM, DATEADD(MI, @GmtOffset, EventDate)), 
     DATEPART(DD, DATEADD(MI, @GmtOffset, EventDate)) 

我擔心是否最終將按照年份或月份不重要的日期對數據進行分組。有誰知道我是否正確地做到了這一點? EventDateDateTime字段,我想按日間隔執行GROUP BY

感謝

編輯: 這是正確的做法,一個簡單的格式交換......有時我需要更多的咖啡。

INSERT @Results 
(
    [Date], 
    [Result] 
) 
SELECT 
    CAST(DATEADD(MI, @GmtOffset, BundleEvent.EventDate) AS DATE), 
    Result = CASE WHEN @Metric = 'Take Rate' THEN 0 ELSE COUNT(*) END 
FROM dbo.BundleEvent WITH (NOLOCK) 
JOIN dbo.BundleUser WITH (NOLOCK) 
    ON BundleEvent.BundleId = BundleUser.BundleId 
JOIN dbo.Bundle WITH (NOLOCK) 
    ON BundleEvent.BundleId = Bundle.BundleId 
WHERE BundleEvent.EventDate >= @StartTimeGmt AND BundleEvent.EventDate <= @EndTimeGmt 
    AND BundleEvent.BundleEventTypeId = CASE WHEN @Metric = 'Take Rate' THEN @TypeTakeId ELSE @BundleEventTypeId END 
    AND BundleUser.UserId = CASE WHEN @UserId IS NULL THEN BundleUser.UserId ELSE @UserId END 
    AND Bundle.BundleType = 1 
GROUP BY 
    CAST(DATEADD(MI, @GmtOffset, BundleEvent.EventDate) AS DATE) 

然後我做了子與交換格式比較:

  CAST(
       (SELECT COUNT(*) 
       FROM dbo.BundleEvent WITH (NOLOCK) 
       JOIN dbo.BundleUser WITH (NOLOCK) 
        ON BundleEvent.BundleId = BundleUser.BundleId 
       JOIN dbo.Bundle WITH (NOLOCK) 
        ON BundleEvent.BundleId = Bundle.BundleId 
       WHERE CAST(DATEADD(MI, @GmtOffset, BundleEvent.EventDate) AS DATE) = [Date] 
       AND BundleEvent.BundleEventTypeId = @TypeTakeId 
       AND BundleUser.UserId = CASE WHEN @UserId IS NULL THEN BundleUser.UserId ELSE @UserId END 
       AND Bundle.BundleType = 1) 
       AS DECIMAL(5,2) 

因此,在本質查詢被正確地匹配起來,並使用新的格式。

+0

你的測試數據產生了什麼? – 2012-01-10 01:21:10

回答

0

既然你不使用和集料(除COUNT(*),你確定你想要一個GROUP BY使用DISTINCT將產生所有匹配的日期單個插入條目;也許是這樣的:?

DECLARE @DATE_GMT datetime 
SET @DATE_GMT=DATEADD(MI, @GmtOffset, EventDate) 
INSERT @Results 
(
    [Day], 
    [Month], 
    [Year], 
    [Result] 
) 
SELECT DISTINCT 
    DATEPART(DD, @DATE_GMT), 
    DATEPART(MM, @DATE_GMT), 
    DATEPART(YY, @DATE_GMT), 
    Result = CASE WHEN @Metric = 'Take Rate' THEN NULL ELSE COUNT(*) END 
FROM BundleEvent 
WHERE BundleEventTypeId = CASE WHEN @Metric = 'Take Rate' THEN @TypeTakeId ELSE @BundleEventTypeId END 
    AND EventDate Between @StartTime AND @EndTime 
+0

嗨,我所做的是再次運行GMT時間的實際日期,而不是像這樣的開始或結束時間段: – Darren 2012-01-13 23:34:49