Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да промените заявката, за да предоставите последните 15 седмици данни вместо последните 15 дни от SQL Server

Променете DATEADD от ден на седмица. Следователно две промени:

dateadd(week, @LastXDays, l_update)

и

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

В този случай бих преименувал и @LastXDays променлива към @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

Също така един съвет:не използвайте подсказки за заявки (NOLOCK ), ако не разбирате употребата им. В този случай, използвайки NOLOCK може да има катастрофално въздействие върху вашите резултати.

Ето няколко статии, които трябва да прочетете, преди да решите дали ще продължите да използвате NOLOCK или не.

Разбиране на подсказката за SQL Server NOLOCK

Вредни навици:поставяне на 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. Грешка на SQL Server:ExecuteNonQuery:свойството на връзката не е инициализирано

  2. Значение на първичен ключ към Microsoft SQL Server 2008

  3. SQL Async множество заявки комбинира резултати -- максимални резултати (горни XYZ)

  4. как да преминете през таблица, за да намерите набор от данни?

  5. VMware CPU Hot Plug vNUMA Ефекти върху SQL Server