1

Sql Server 2005 (Tsql) に関する質問があります

2つの列があります 日付 ステータス

そして、データは..のように見えます

Date                    Status

2012-09-01 00:01:00.000 2

2012-09-01 04:17:00.000 4

2012-09-01 04:34:00.000 4

2012-09-01 04:35:00.000 4

2012-09-01 04:35:48.000 4

2012-09-01 04:35:51.000 1

2012-09-01 17:28:25.000 2

2012-09-01 23:58:00.000 4

2012-09-01 23:59:00.000 1

ステータス間の時間差を計算する必要があります...たとえば。最小時間はステータス2の開始時で、ステータス= 1(停止)の最大時間はその日付の間で分数が必要です。カーソルを使用してステータスを確認し、最小時間と最大時間を変数に記録しました

CTEを使用して簡単に実行できますか。

クエリが完了するまでに時間がかかります...助けてください。

   DECLARE @pdunitid INT
        DECLARE @Date DATETIME
        DECLARE @pddatetime DATETIME
        DECLARE @pdstatus INT
        DECLARE @starttime DATETIME
        DECLARE @endTime DATETIME
        DECLARE @calc INT
        DECLARE @Totaltime INT
        DECLARE @START INT


        SET @pdunitid = 33568906
        SET @Date = GETDATE() - 102
        set @Totaltime = 0
        SET @calc = 0
        SET @START = 0


        DECLARE s CURSOR FAST_FORWARD FOR
        SELECT pddatetime,pdstatus FROM s1 WITH (NOLOCK)
        WHERE  pdunitid = @pdUnitid
        AND CONVERT(VARCHAR,pddatetime,112) = CONVERT(VARCHAR,@Date,112)
        ORDER BY pddatetime,pdstatus 

        OPEN s 

        FETCH NEXT FROM s INTO @pddatetime,@pdstatus
        WHILE @@FETCH_STATUS = 0 
            BEGIN
                -- status 2 is for start sometimes you don't get start so you will have to use the first date with status 4

                IF pdstatus IN (2,4)  AND @START = 0 
                    BEGIN 
                        SET @starttime = @pddatetime
                        SET @START = 1
                    END

                -- status 1 is for stop 

                IF (@pdstatus= 1) 
                    BEGIN 
                        SET @endTime = @pddatetime
                        SET @calc = 1   
                    END

                -- if you dont get the status 1 by '23:59:00' take the end time


            IF  convert(varchar,@pdgpsdatetime,108) = '23:59:00'
                    BEGIN 
                        SET @endTime = @pddatetime
                        SET @calc = 1   
            END

                -- Calculate the minutes.

                IF @calc = 1 
                    BEGIN 
                        SET @Totaltime = @Totaltime + DATEDIFF(mi, @starttime,@endTime)
                        SET @calc = 0   
                        SET @START = 0
                    END
        FETCH NEXT FROM s INTO @pddatetime,@pdstatus
            END
        CLOSE s
        DEALLOCATE s

        SELECT  @Totaltime
4

1 に答える 1