sql >> Database >  >> RDS >> Sqlserver

Hoe de query te wijzigen om de laatste 15 weken aan gegevens te geven in plaats van de laatste 15 dagen van de SQL Server

Wijzig de DATEADD van dag tot week. Vandaar twee wijzigingen:

dateadd(week, @LastXDays, l_update)

en

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

In dit geval zou ik ook de naam van de @LastXDays variabele naar @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

Ook een advies:gebruik geen zoekopdrachthints (NOLOCK ) als u het gebruik ervan niet begrijpt. Gebruik in dit geval NOLOCK kan rampzalige gevolgen hebben voor uw resultaten.

Hier zijn een paar artikelen die u moet lezen voordat u beslist of u NOLOCK blijft gebruiken of niet.

De SQL Server NOLOCK-hint begrijpen

Slechte gewoonten:NOLOCK overal aanbrengen




  1. Verbinding maken met de database met behulp van de NaviCat MySQL-client

  2. Gegroepeerde rangschikking uitvoeren in MySQL

  3. Werk een rij bij, maar voeg in als rij niet bestaat in codeigniter

  4. Lijst woorden geïndexeerd door Innodb fulltext