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