sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man ändrar frågan för att ge de senaste 15 veckorna med data istället för de senaste 15 dagarna från SQL Server

Ändra DATEADD från dag till vecka. Därför två ändringar:

dateadd(week, @LastXDays, l_update)

och

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

I det här fallet skulle jag också byta namn på @LastXDays variabel till @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

Ett råd också:använd inte frågetips (NOLOCK ) om du inte förstår deras användning. I det här fallet använder du NOLOCK kan få katastrofala effekter på dina resultat.

Här är några artiklar som du bör läsa innan du bestämmer dig för om du ska fortsätta använda NOLOCK eller inte.

Förstå SQL Server NOLOCK-tipset

Dåliga vanor :Placera NOLOCK överallt




  1. ORA-1114 Kör Datapatch

  2. Hur skaffar man tjänsteuppgifter för en tjänsteinstans skapad på IBM Bluemix utan att binda instansen till en applikation på Bluemix?

  3. Använd set i en case-sats i SQL Server

  4. hur man laddar upp flera bilder till mappar med jsp och servlet