sql >> データベース >  >> RDS >> Sqlserver

SQL Server からの過去 15 日間ではなく、過去 15 週間のデータを提供するようにクエリを変更する方法

    DATEADD を変更します 日から週へ。したがって、2 つの変更:

    dateadd(week, @LastXDays, l_update)

    そして

    dateadd(week, (@LastXDays + 1), @MaxDate)

    この場合、@LastXDays の名前も変更します 変数を @LastXWeeks に .

    CREATE PROCEDURE [dbo].[spGetPlayingTimeOfthepeoplesPerDay] @email NVARCHAR(50)
    AS
    BEGIN
        SET NOCOUNT ON;
    
        DECLARE @MinDate DATE
            ,@MaxDate DATE
            ,@LastXDays INT
    
        SELECT @LastXWeeks = - 15
    
        SELECT @MaxDate = peoples.l_update
        FROM peoples
        WHERE peoples.email = @email
    
        DECLARE @test TABLE (
            quantity VARCHAR(100)
            ,DATE DATE
            ,TimePerDay DECIMAL(5, 2)
            );
    
        WITH CTE
        AS (
            SELECT peoples.email
                ,peoples.l_update
                ,act.quantity
                ,act.starttime
                ,act.endtime
                ,act.duration AS [Totaltime]
            FROM peoples
            INNER JOIN MPeoples ON peoples.Id = MPeoples.parent_id
            INNER JOIN slines ON MPeoples.id = slines.movesuser_id
            INNER JOIN seg ON slines.id = seg.sline_id
            INNER JOIN act ON seg.id = act.seg_id
            WHERE act.quantity = 'playing'
                AND (peoples.email = @email)
            GROUP BY peoples.email
                ,act.quantity
                ,act.duration
                ,act.starttime
                ,act.endtime
                ,peoples.l_update
            )
        INSERT INTO @test (
            quantity
            ,DATE
            ,TimePerDay
            )
        SELECT quantity
            ,Cast(starttime AS DATE) AS DATE
            ,SUM(datediff(second, starttime, endtime)) / 60.0 AS TimePerDay
        FROM cte WITH (NOLOCK)
        WHERE starttime >= dateadd(week, @LastXWeeks, l_update)
        GROUP BY quantity
            ,cast(starttime AS DATE)
    
        SELECT @MaxDate = @MaxDate
            ,@MinDate = dateadd(week, (@LastXWeeks + 1), @MaxDate);
    
        WITH AllDates
        AS (
            SELECT @MinDate AS xDate
    
            UNION ALL
    
            SELECT Dateadd(Day, 7, xDate)
            FROM AllDates AS ad
            WHERE ad.xDate < @MaxDate
            )
        SELECT 'playing' AS quantity
            ,ad.xDate
            ,Isnull(t.TimePerDay, 0) AS TimePerDay
        FROM AllDates AS ad WITH (NOLOCK)
        LEFT JOIN @test AS t ON ad.xDate = t.DATE
    END
    

    また、アドバイス:クエリ ヒントを使用しないでください (NOLOCK ) それらの使用法を理解していない場合。この場合、NOLOCK を使用します。 結果に壊滅的な影響を与える可能性があります。

    NOLOCK を使い続けるかどうかを決める前に読むべきいくつかの記事を次に示します。

    SQL Server NOLOCK ヒントについて

    悪い習慣 :どこにでも NOLOCK を置く




    1. SQL Server でのレコードセットのループ

    2. Robolectricアクセスデータベースはエラーをスローします

    3. Scala SlickでEnumを使用する方法は?

    4. SQL結合チュートリアル