sqlserver中如何查询出连续日期记录的代码

sqlserver中如何查询出连续日期记录的代码,第1张

你这个需要借助一个流水表,然后通过指定日期对流水表,进行数据叠加 *** 作,

类似流水日期生成方法

---生成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查询日期为连续的数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10631992.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-10
下一篇2023-05-10

发表评论

登录后才能评论

评论列表(0条)

    保存