2012-01-10 3 views
-1

間隔日で私の結果を私はMSSQLにストアドプロシージャを作っていますし、私はグループにしたい、私はわからないよ:特定の間隔でdatetime列を正しく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フィールドであり、1日の間隔でGROUP BYを実行します。

おかげ

EDIT: これは正しい方法、簡単な形式の交換である...時々私はより多くのコーヒーを必要とします。

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

あなたのテストデータは何を生成しますか? –

答えて

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

関連する問題