2012-01-10 96 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