sql server 时间段补齐查询 Sql

1、原始数据

2、查询

-- 定义开始时间、结束时间  用于循环接收数据
declare @start_time datetime
declare @end_time datetime
-- 定义循环过程中,上一个数据的开始时间、结束时间 用于做对比
declare @last_start_time datetime
declare @last_end_time datetime
-- 定义一天最小值和最大值
declare @min_time datetime
declare @max_time datetime

-- 定义临时表 用于保存数据
declare @temp_table table (
    start_time datetime,
    end_time datetime
)

-- 设置一天内最小值和最大值
set @min_time = convert(varchar(10),getdate(),120)
set @max_time = convert(varchar(10),getdate(),120) + ' 23:59:59'

-- 临时数据  正式使用时 删掉
set @min_time = '2022-06-06 00:00:00'
set @max_time = '2022-06-06 23:59:59'

-- 设置上一个数据的开始时间、结束时间 初始值未空
set @last_start_time = null
set @last_end_time = null


-- 添加原始数据
insert into @temp_table values('2022-06-06 05:45:21','2022-06-06 08:12:55')
insert into @temp_table values('2022-06-06 09:23:21','2022-06-06 10:41:15')
insert into @temp_table values('2022-06-06 09:40:55','2022-06-06 13:22:41')
insert into @temp_table values('2022-06-06 14:34:43','2022-06-06 16:46:23')
insert into @temp_table values('2022-06-06 20:22:45','2022-06-06 22:36:54')

-- 添加最开始的一段时间  原始数据中不包含开始时间为@min_time的数据
if(not exists(select * from @temp_table where start_time = @min_time))
begin
    insert into @temp_table
    SELECT top 1 @min_time,start_time 
    FROM @temp_table order by start_time
end

-- 添加最后的一段时间  原始数据中不包含结束时间为@max_time的数据
if(not exists(select * from @temp_table where end_time = @max_time))
begin
    insert into @temp_table
    SELECT top 1 end_time,@max_time 
    FROM @temp_table order by end_time desc 
end

-- 定义游标
declare @temp_cursor cursor
set @temp_cursor = cursor scroll FOR 
-- 查询数据
select * from @temp_table order by start_time
-- 打开游标
open @temp_cursor
    fetch next from @temp_cursor into @start_time,@end_time
    while @@fetch_status <> -1
    begin
        -- 上一条数据的开始时间和结束时间不等于空
        if(@last_start_time is not null and @last_end_time is not null) 
        begin
           -- 当前数据开始时间大于上一条数据的结束时间时 添加断开的时间段
           if(@start_time > @last_end_time)
           begin
              insert into @temp_table
              select @last_end_time,@start_time
           end
        end

        -- 设置上一条数据的开始时间和结束时间
        set @last_start_time = @start_time
        set @last_end_time = @end_time

        fetch next from @temp_cursor into @start_time,@end_time
    end
-- 关闭游标
close @temp_cursor
-- 释放游标
deallocate @temp_cursor

-- 查询结果
select * from @temp_table order by start_time

3、结果

注:以上代码属个人整理,用于交流学习。(QQ/微信:742010299 昵称:同心同德)

posted @ 2022-06-06 11:05  同心同德  阅读(316)  评论(0编辑  收藏  举报