Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana mengubah kueri untuk memberikan data 15 minggu terakhir alih-alih 15 hari terakhir dari SQL Server

Ubah DATEADD dari hari ke minggu. Oleh karena itu, dua perubahan:

dateadd(week, @LastXDays, l_update)

dan

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

Dalam hal ini, saya juga akan mengganti nama @LastXDays variabel ke @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

Juga, saran:jangan gunakan petunjuk kueri (NOLOCK ) jika Anda tidak memahami penggunaannya. Dalam hal ini, menggunakan NOLOCK dapat berdampak buruk pada hasil Anda.

Berikut adalah beberapa artikel yang harus Anda baca sebelum memutuskan apakah Anda akan tetap menggunakan NOLOCK atau tidak.

Memahami petunjuk NOLOCK SQL Server

Kebiasaan buruk :Menempatkan NOLOCK di mana-mana




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Berhenti membuat SQL Server melakukan pekerjaan kotor Anda

  2. Bagaimana mencegah shutdown otomatis SQL Server LocalDB?

  3. Kesalahan Umum SQL Server

  4. Fungsi kustom dengan batasan centang SQL Server 2008

  5. Php memanggil skrip database cadangan sqlserver, file cadangan dibuat dan kemudian dihapus