Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách thay đổi truy vấn để cung cấp dữ liệu 15 tuần qua thay vì 15 ngày qua từ SQL Server

Thay đổi DATEADD từ ngày này sang tuần khác. Do đó, có hai thay đổi:

dateadd(week, @LastXDays, l_update)

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

Trong trường hợp này, tôi cũng sẽ đổi tên @LastXDays biến thành @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

Ngoài ra, một lời khuyên:không sử dụng gợi ý truy vấn (NOLOCK ) nếu bạn không hiểu công dụng của chúng. Trong trường hợp này, sử dụng NOLOCK có thể có tác động tai hại đến kết quả của bạn.

Dưới đây là một số bài viết mà bạn nên đọc trước khi quyết định xem bạn có tiếp tục sử dụng NOLOCK không hoặc không.

Hiểu gợi ý SQL Server NOLOCK

Thói quen xấu:Đặt NOLOCK ở khắp mọi nơi




  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 Chuyển đổi Varchar thành Datetime

  2. SQL chạy Biến +1 cho đến khi Biến đạt 52?

  3. Truy vấn tìm kiếm trên nhiều cột của một bảng?

  4. Lỗi:Không thể lồng nhau câu lệnh INSERT EXEC. và Không thể sử dụng câu lệnh ROLLBACK trong câu lệnh INSERT-EXEC. Làm thế nào để giải quyết điều này?

  5. Thay thế giá trị null trong truy vấn sql pivot động