sql >> Databáze >  >> RDS >> Sqlserver

Jak změnit dotaz tak, aby poskytoval data za posledních 15 týdnů namísto posledních 15 dnů ze serveru SQL

Změňte DATEADD ze dne na týden. Proto dvě změny:

dateadd(week, @LastXDays, l_update)

a

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

V tomto případě bych také přejmenoval @LastXDays proměnná na @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

Také jedna rada:nepoužívejte tipy pro dotazy (NOLOCK ), pokud nerozumíte jejich použití. V tomto případě pomocí NOLOCK může mít katastrofální dopad na vaše výsledky.

Zde je několik článků, které byste si měli přečíst, než se rozhodnete, zda budete nadále používat NOLOCK nebo ne.

Porozumění tipu SQL Server NOLOCK

Špatné návyky :dávat NOLOCK všude




  1. Proč se mi zobrazuje chyba formátu:Vlastnost 'v$session.program' se připojuje k Oracle?

  2. poskytování certifikátů Tomcat jndi připojení k postgresql

  3. Standardní číselné formátovací řetězce Podporované FORMAT() v SQL Server

  4. Nelze spustit IntelliJ IDEA CE 12 s Ubuntu Oracle Java 8