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 昵称:同心同德)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南