似乎很難通過使用sql語句來修復它,所以我寫了一個過程來解決此問題。你有什麼好主意嗎?特別是對於sql語句。
CREATE TABLE [dbo].[A] (
[id] int NOT NULL ,
[starttime] datetime NOT NULL ,
[endtime] datetime NULL ,
[status] int NULL ,
PRIMARY KEY ([id], [starttime])
)
CREATE TABLE [dbo].[B] (
[partno] int NULL ,
[dayhourStart] varchar(255) NULL ,
[dayHourEnd] varchar(255) NULL
)
INSERT INTO [A] ([id], [starttime], [endtime], [status]) VALUES ('9', '2016-09-19 02:36:05.000', '2016-09-19 03:02:16.000', '1');
INSERT INTO [A] ([id], [starttime], [endtime], [status]) VALUES ('9', '2016-09-19 03:02:16.000', '2016-09-19 09:26:15.000', '1');
INSERT INTO [A] ([id], [starttime], [endtime], [status]) VALUES ('9', '2016-09-19 09:26:15.000', '2016-09-20 01:18:02.000', '1');
INSERT INTO [B] ([partno], [dayhourStart], [dayHourEnd]) VALUES ('3', '12:00:00', '19:00:00');
INSERT INTO [B] ([partno], [dayhourStart], [dayHourEnd]) VALUES ('3', '22:00:00', '23:59:59');
INSERT INTO [B] ([partno], [dayhourStart], [dayHourEnd]) VALUES ('3', '19:00:00', '22:00:00');
INSERT INTO [B] ([partno], [dayhourStart], [dayHourEnd]) VALUES ('1', '09:00:00', '12:00:00');
INSERT INTO [B] ([partno], [dayhourStart], [dayHourEnd]) VALUES ('2', '00:00:00', '08:00:00');
ALTER PROCEDURE [dbo].[uspSumTimeByPart]
AS
BEGIN
create table #resultTb(
partno int,
starttime datetime,
endtime datetime,
sumtime float
)
declare @id int,@starttime datetime,@endtime datetime;
declare @partno int,@dayHourStart VARCHAR(20),@dayHourEnd VARCHAR(20);
DECLARE crs_data CURSOR for SELECT id ,starttime ,endtime FROM a where status=1;
open crs_data ;
FETCH next FROM crs_data into @id ,@starttime ,@endtime ;
WHILE(@@fetch_status=0) BEGIN
--declare @daytimeStart datetime,@daytimeEnd datetime;
declare @daytimeStartStr VARCHAR(20),@daytimeEndStr VARCHAR(20);
set @daytimeStartStr = CONVERT(VARCHAR(10),@starttime,120);
set @daytimeEndStr = CONVERT(VARCHAR(10),@endtime,120);
DECLARE @tempdate VARCHAR(20) = @daytimeStartStr;
WHILE(DATEDIFF(ss, @tempdate, @daytimeEndStr) >= 0) BEGIN --iterate from @starttime to @endtime to get the day from it.
DECLARE crs_part CURSOR for SELECT partno,dayHourStart,dayHourEnd FROM b ;
open crs_part ;
FETCH next FROM crs_part into @partno,@dayHourStart,@dayHourEnd;
WHILE(@@fetch_status=0) BEGIN
declare @part_daytimeStart datetime,@part_daytimeEnd datetime;
set @part_daytimeStart = Cast(CONVERT(VARCHAR(10),@tempdate,120)+' '[email protected] as datetime);
set @part_daytimeEnd = Cast(CONVERT(VARCHAR(10),@tempdate,120)+' '[email protected] as datetime);
IF (NOT(@part_daytimeStart > @endtime or @part_daytimeEnd < @starttime)) BEGIN
declare @startdate datetime,@enddate datetime;
set @startdate = (case when @part_daytimeStart>[email protected] and @part_daytimeStart<[email protected] then @part_daytimeStart else @starttime end);
set @enddate = (case when @part_daytimeEnd <= @endtime and @part_daytimeEnd >= @starttime then @part_daytimeEnd else @endtime end);
INSERT into #resultTb(partno,starttime,endtime,sumtime) values (@partno,
@startdate,@enddate, DATEDIFF(minute, @startdate, @enddate)
);
END
FETCH next FROM crs_part into @partno,@dayHourStart,@dayHourEnd;
END
CLOSE crs_part
DEALLOCATE crs_part;
set @tempdate = CONVERT(VARCHAR(10),DATEADD(dd, 1, @tempdate),120);
END
FETCH next FROM crs_data into @id ,@starttime ,@endtime ;
END
SELECT * FROM #resultTb
drop table #resultTb;
CLOSE crs_data;
DEALLOCATE crs_data;
END
什麼是id - partno連接? – jarlh