-1

Следующий запрос дает время воспроизведения пользователей из базы данных ежедневно в течение последних 15 дней. Он добавляет 0, если игра не воспроизводится. Теперь я хочу получать данные игрового времени еженедельно и 0, если в течение недели игра не воспроизводится. Поэтому я хочу, чтобы запрос выдавал последние 15 недель данных.Как изменить запрос на получение последних 15 недель данных вместо последних 15 дней с SQL Server

Это ежедневный запрос.

CREATE PROCEDURE [dbo].[spGetPlayingTimeOfthepeoplesPerDay] @email NVARCHAR(50) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @MinDate DATE 
     ,@MaxDate DATE 
     ,@LastXDays INT 

    SELECT @LastXDays = - 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(day, @LastXDays, l_update) 
    GROUP BY quantity 
     ,cast(starttime AS DATE) 

    SELECT @MaxDate = @MaxDate 
     ,@MinDate = dateadd(day, (@LastXDays + 1), @MaxDate); 

    WITH AllDates 
    AS (
     SELECT @MinDate AS xDate 

     UNION ALL 

     SELECT Dateadd(Day, 1, 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 
+1

Это не очень понятно, что вы пытаетесь сделать здесь. Может быть, так же просто, как чередовать ваши функции DATEADD на неделю вместо дня? Я должен спросить ... почему в мире вы используете подсказку NOLOCK на своем ците ??? –

+0

То, что я тоже думал, я попробую. Вот парень, который помог мне достичь этого http://stackoverflow.com/questions/31160089/how-to-extend-the-query-to-add-0-in-the-cell-when-no-activity-is -performed –

+0

Итак, у вас уже есть ответ? Или это откуда появился NOLOCK? Вы понимаете, что делает этот намек? Если нет, то почему вы его используете? На данный момент я не знаю, нужна ли вам помощь здесь или нет. Если вы это сделаете, вам нужно объяснить это более четко. Если нет, то поздравления. –

ответ

0

Измените 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 или нет.

Understanding the SQL Server NOLOCK hint

Bad habits : Putting NOLOCK everywhere

+0

В конце есть еще один метод dateadd, однако он не работает по мере необходимости. Он не суммирует значения 7 дней игрового времени. –

+0

@Asbat Как нас найти? –

+0

Могу ли я изменить Dateadd (День, 7, xDate) на Dateadd (неделя, 7, xDate) или нет? –

Смежные вопросы