Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So ändern Sie die Abfrage so, dass die Daten der letzten 15 Wochen statt der letzten 15 Tage vom SQL Server angezeigt werden

Ändern Sie das DATEADD von Tag zu Woche. Daher zwei Änderungen:

dateadd(week, @LastXDays, l_update)

und

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

In diesem Fall würde ich auch @LastXDays umbenennen Variable zu @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

Außerdem ein Ratschlag:Verwenden Sie keine Abfragehinweise (NOLOCK ), wenn Sie deren Verwendung nicht verstehen. Verwenden Sie in diesem Fall NOLOCK kann verheerende Auswirkungen auf Ihre Ergebnisse haben.

Hier sind ein paar Artikel, die Sie lesen sollten, bevor Sie entscheiden, ob Sie NOLOCK weiterhin verwenden oder nicht.

Den NOLOCK-Hinweis von SQL Server verstehen

Schlechte Angewohnheiten:NOLOCK überall platzieren