Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak zmienić zapytanie, aby podało dane z ostatnich 15 tygodni zamiast z ostatnich 15 dni z serwera SQL?

Zmień DATEADD z dnia na tydzień. Stąd dwie zmiany:

dateadd(week, @LastXDays, l_update)

i

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

W tym przypadku zmieniłbym również nazwę @LastXDays zmienna do @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

Również rada:nie używaj podpowiedzi do zapytań (NOLOCK ), jeśli nie rozumiesz ich użycia. W tym przypadku użyj NOLOCK może mieć katastrofalny wpływ na Twoje wyniki.

Oto kilka artykułów, które powinieneś przeczytać przed podjęciem decyzji, czy nadal będziesz używać NOLOCK czy nie.

Zrozumienie wskazówki NOLOCK serwera SQL

Złe nawyki:wszędzie umieszczaj NOLOCK




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jeszcze raz:procedura składowana a TV-UDF

  2. Obsługa wartości NULL w UNPIVOT

  3. Jak używać Try Catch do wyświetlania błędu logowania dla parametrów połączenia (App.Config)

  4. Dapper.NET i przechowywany proc z wieloma zestawami wyników

  5. Wskazanie podstawowego/domyślnego rekordu w bazie danych