實現內容的時間交集計算的sql語句
作者:佚名
如果SQL數據庫中的記錄時間有交集,計算時又需要過濾掉,那么該SQL語句應該怎么寫呢?下面就為您介紹該SQL語句的詳細寫法,供您參考。
sql語句可以實現大量我們需要的功能,下面介紹的sql語句可以實現內容的時間交集計算,希望對您有所啟迪。
如果在系統中有一張IM的登錄記錄表,里面是員工IM的登錄時間,有登錄時間,離線時間,***活動時間。
因為員工上半時有可能會同時登錄多個IM,其中的時間會有交集,因為要計算員工每天IM在線的工作時間,交集時間需要過濾掉。
直接在sql server中就可以比較方便的計算出相關內容。具體的直接上sql語句代碼:
- --方便演示,定義一個Source的表變量,BeginTime是登錄時間,EndTime是離線時間
- declare @Source table(ID INT IDENTITY(1,1),BeginTime datetime, EndTime datetime)
- --定義輸出結果表變量
- declare @Result table(id INT IDENTITY(1,1),BeginTime datetime, EndTime DATETIME,OnlineTime INT NULL)
- --插入演示數據
- insert into @Source values('2010-08-16 08:00:00','2010-08-16 08:40:00')
- insert into @Source values('2010-08-16 09:00:00','2010-08-16 11:30:00')
- insert into @Source values('2010-08-16 09:01:00','2010-08-16 11:32:00')
- insert into @Source values('2010-08-16 10:01:00','2010-08-16 12:01:00')
- insert into @Source values('2010-08-16 11:00:00','2010-08-16 12:05:00')
- insert into @Source values('2010-08-16 12:10:00','2010-08-16 13:40:00')
- insert into @Source values('2010-08-16 13:10:00','2010-08-16 14:15:00')
- insert into @Source values('2010-08-16 14:00:00','2010-08-16 16:32:00')
- insert into @Source values('2010-08-16 07:20:00','2010-08-16 16:40:00')
- insert into @Source values('2010-08-16 17:00:00','2010-08-16 20:32:00')
- insert into @Source values('2010-08-16 07:00:00','2010-08-16 07:18:00')
- insert into @Source values('2010-08-16 07:30:00','2010-08-16 08:20:00')
- --模擬數據庫中的數據,插入一些其他時間的數據
- insert into @Source values('2010-08-15 08:00:00','2010-08-16 08:40:00')
- insert into @Source values('2010-08-17 09:00:00','2010-08-16 11:30:00')
- insert into @Source values('2010-08-14 09:01:00','2010-08-16 11:32:00')
- insert into @Source values('2010-08-13 10:01:00','2010-08-16 12:01:00')
- insert into @Source values('2010-08-17 11:00:00','2010-08-16 12:05:00')
- insert into @Source values('2010-08-17 12:10:00','2010-08-16 13:40:00')
- insert into @Source values('2010-08-17 13:10:00','2010-08-16 14:15:00')
- insert into @Source values('2010-08-17 14:00:00','2010-08-16 16:32:00')
- insert into @Source values('2010-08-15 07:20:00','2010-08-16 16:40:00')
- insert into @Source values('2010-08-13 17:00:00','2010-08-16 20:32:00')
- insert into @Source values('2010-08-12 07:00:00','2010-08-16 07:18:00')
- insert into @Source values('2010-08-11 07:30:00','2010-08-16 08:20:00')
- --定義需要用到的變量
- DECLARE @count INT,@ID INT,@begintime DATETIME,@endtime DATETIME,@Date DATE
- --如果需要指定計算的日期,可以設置日期值,否則為null會計算全部的時間
- SET @Date = '2010-08-16 07:30:00'
- --如果日期不為空,則清除Source中的垃圾數據
- IF @Date IS NOT NULL
- BEGIN
- DELETE FROM @Source WHERE BeginTime < @Date OR BeginTime >= DATEADD(DAY,1,@Date)
- END
- --計算Count,以便進行遍歷
- SELECT @count = COUNT(1) FROM @Source
- --遍歷Source中的數據
- WHILE @count > 0
- BEGIN
- --根據時間排序,每次取1條數據
- SELECT TOP 1 @begintime = BeginTime,@endtime = EndTime ,@IDID = ID FROM @Source
- ORDER BY BeginTime
- --如果Result中沒有記錄,則直接插入,否則進行判斷
- IF NOT EXISTS(SELECT 1 FROM @Result)
- BEGIN
- insert into @Result values(@begintime,@endtime,NULL);
- END
- ELSE
- BEGIN
- --由于Source的數據是經過排序的,所以下面的插入已經無效,直接注釋掉
- --IF NOT EXISTS(SELECT 1 FROM @Result WHERE BeginTime < @endtime AND EndTime < @begintime)
- --BEGIN
- -- insert into @Result values(@begintime,@endtime,NULL);
- --END
- --如果開始時間大于Result中的已存在的記錄結束時間,則直接插入數據
- IF NOT EXISTS(SELECT 1 FROM @Result WHERE EndTime > @begintime)
- BEGIN
- insert into @Result values(@begintime,@endtime,NULL);
- END
- --判斷Result中的數據開始時間是否大于Source中的開始時間,大于則更新
- ELSE IF EXISTS(SELECT 1 FROM @Result WHERE BeginTime > @begintime AND EndTime < @endtime AND EndTime > @endtime)
- BEGIN
- UPDATE @Result SET BeginTime = @begintime WHERE BeginTime > @begintime AND BeginTime < @endtime AND EndTime > @endtime
- END
- --判斷Result中的數據結束時間是否小于Source中的結束時間,小于則更新
- ELSE IF EXISTS(SELECT 1 FROM @Result WHERE BeginTime < @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime)
- BEGIN
- UPDATE @Result SET EndTime = @endtime WHERE BeginTime < @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime
- END
- --判斷Result中的記錄時間是否被Source中的時間被包含,包含則開始與結束都更新
- ELSE IF EXISTS(SELECT 1 FROM @Result WHERE BeginTime > @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime)
- BEGIN
- SELECT * FROM @Result WHERE BeginTime > @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime
- UPDATE @Result SET BeginTime = @begintime, EndTime = @endtime WHERE BeginTime > @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime
- END
- END
- --刪除已經讀取過的記錄
- DELETE FROM @Source WHERE id = @ID
- --更新Count
- SELECT @count = COUNT(1) FROM @Source
- END
- --計算OnlineTime
- UPDATE @Result SET OnlineTime = DATEDIFF(mi,BeginTime,EndTime)
- --顯示結果
- SELECT * FROM @Result
【編輯推薦】
責任編輯:段燃
來源:
互聯網