我有一个与 Sql Server 2005 (Tsql) 相关的问题
我有两列日期状态
数据看起来..像
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