
你这个需要借助一个流水表,然后通过指定日期对流水表,进行数据叠加 *** 作,
类似流水日期生成方法
---生成4月份所有的天数
select dateadd(day,number,'2018-4-1') as d from masterspt_values
where type='p'
and number >=0
and dateadd(day,number,'2018-4-1') between '2018-4-1' and dateadd(day,-1,'2018-5-1')
请试一试,如有疑问,及时沟通!
在层次查询中,Oracle引入了一个伪列level,用来表示当前行(节点)对应的level,
它从1开始计数,每多一层level的值就加1。
我们可以据此实现对两个日期/整数之间所有日期/整数的遍历。
----------------------------------------------------------
SQL> create table test (begin_date date,end_date date);
Table created
SQL> insert into test values(trunc(sysdate),trunc(sysdate+5));
1 row inserted
SQL> select from test;
BEGIN_DATE END_DATE
----------- -----------
2010-4-6 2010-4-11
SQL> select begin_date,end_date,begin_date+level -1 as today
2 from test
3 connect by begin_date + level -1 <= end_date;
BEGIN_DATE END_DATE TODAY
----------- ----------- -----------
2010-4-6 2010-4-11 2010-4-6
2010-4-6 2010-4-11 2010-4-7
2010-4-6 2010-4-11 2010-4-8
2010-4-6 2010-4-11 2010-4-9
2010-4-6 2010-4-11 2010-4-10
2010-4-6 2010-4-11 2010-4-11
6 rows selected
------------------------------------------------------------------插入两条记录,看该查询语句是否可行
SQL> insert into test values(trunc(sysdate+4),trunc(sysdate+7));
1 row inserted
SQL> select from test;
BEGIN_DATE END_DATE
----------- -----------
2010-4-6 2010-4-11
2010-4-10 2010-4-13
SQL> select distinct begin_date+level-1 as today
2 from test
3 connect by begin_date+level-1 <= end_date;
TODAY
-----------
2010-4-7
2010-4-13
2010-4-8
2010-4-11
2010-4-9
2010-4-6
2010-4-10
2010-4-12
8 rows selected
--------------------------------------- 根据最大和最小值得查询
SQL> delete from test where begin_date = to_date('2010-4-10','yyyy-mm-dd');
1 row deleted
SQL> select from test;
BEGIN_DATE END_DATE
----------- -----------
2010-4-6 2010-4-11
SQL> SELECT one_date
2 FROM (SELECT start_date + level - 1 one_date
3 FROM (SELECT min(begin_date) start_date, max(end_date) end_date
4 FROM test) test
5 connect BY start_date + level - 1 <= end_date ) all_date,
6 test
7 WHERE one_date BETWEEN begin_date AND end_date;
ONE_DATE
-----------
2010-4-6
2010-4-7
2010-4-8
2010-4-9
2010-4-10
2010-4-11
6 rows selected
/求连续旷工三天以上的数据/
declare @t table(name varchar(10), [date] datetime,n int default(1))
insert into @t(name,date) select '张三','20110901'
union select '张三','20110908'
union select '张三','20110909'
union select '张三','20110910'
union select '李四','20110906'
union select '李四','20110909'
union select '李四','20110912'
union select '李四','20110915'
union select '小五','20110806'
select from @t
--select name,COUNT() 次数
-- from @t group by name having(COUNT()>3)
declare @nm varchar(10),@d datetime,@n int=1,@lastNm varchar(10)='',@lastD datetime='19000101',@lastN int =1
declare cur cursor for select name ,[date],n from @t order by name,date
open cur
fetch next from cur into @nm,@d,@n
while (@@FETCH_STATUS =0 ) begin
if @lastNm =@nm and @d=@lastD+1 begin
update @t set n = @lastN +1 where name=@nm and [date]=@d
select @lastN = n from @t where name=@nm and [date]=@d
set @lastNm=@nm
set @lastD =@d
end
else begin
set @lastNm = @nm
set @lastD =@d
set @lastN = @n
end
fetch next from cur into @nm,@d,@n
end
close cur
deallocate cur
select from @t where n>=3
可用=DATEDIF(A1,A2,"m"),大于1的就是缺失的月份。
但你要如何表示出来?
如:
=IF(DATEDIF(A1,A2,"m")>1,"缺"&TEXT(DATE(YEAR(A1),MONTH(A1)+1,DAY(A1)),"e/m/d"),"")
看你的补充,黑色单元格为缺失月份,那么该列(A列)月份就是顺序的了 ?
对黑色部分补充完整就行了。
看你的A列,应该不是日期格式,而是数值格式吧?可用定位空值:
选A列——Ctrl+G——定位条件——选择:空值(点选)——确定——在编辑栏输入:
=A4+1
——按Ctrl+Enter结束计算。
(你的第一个空值在A5,公式就引用上一个单元格A4+1)
但如果A列是日期格式,公式就要改为:
=DATE(YEAR(A4),MONTH(A4)+1,DAY(A4))
以上就是关于sqlserver中如何查询出连续日期记录的代码全部的内容,包括:sqlserver中如何查询出连续日期记录的代码、如何用SQL返回两个日期之间的所有连续日期、SQL查询日期为连续的数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)