gpt4 book ai didi

sql - 查找一组日期范围中的空白的好方法是什么?

转载 作者:行者123 更新时间:2023-12-03 00:17:05 27 4
gpt4 key购买 nike

查找一组日期范围中的空白的方法是什么?

例如,我有这些日期范围:

1/ 1/11 - 1/10/11  
1/13/11 - 1/15/11
1/20/11 - 1/30/11

那么我的开始日期和结束日期分别为 2011 年 1 月 7 日和 2011 年 1 月 14 日。

我希望能够知道 2011 年 1 月 10 日和 2011 年 1 月 13 日之间存在间隙,因此不可能确定开始日期和结束日期。或者我只想返回直到遇到的第一个间隙为止的日期跨度。

如果这可以在 SQL Server 中完成,那就太好了。

我想检查每个日期,看看它是否在一个日期范围内……如果没有,那么那天就有一个间隙。

最佳答案

  • 跳转到倒数第二个代码块:*我希望能够告诉您这一点
    2011 年 1 月 10 日至 2011 年 1 月 13 日之间有
    一个间隙,因此开始和结束日期是*
    不可能。
  • 跳转到最后一个代码块:*我只想返回
    日期跨度到第一个间隙
    遇到过。*

首先,这里有一个虚拟表来讨论

create table spans (date1 datetime, date2 datetime);
insert into spans select '20110101', '20110110';
insert into spans select '20110113', '20110115';
insert into spans select '20110120', '20110130';

这是一个查询,将单独列出日历中的所有日期

declare @startdate datetime, @enddate datetime
select @startdate = '20110107', @enddate = '20110114'
select distinct a.date1+v.number
from spans A
inner join master..spt_values v
on v.type='P' and v.number between 0 and datediff(d, a.date1, a.date2)
-- we don't care about spans that don't intersect with our range
where A.date1 <= @enddate
and @startdate <= A.date2

有了这个查询,我们现在可以测试是否存在任何间隙,方法是根据预期天数计算日历中的天数

declare @startdate datetime, @enddate datetime
select @startdate = '20110107', @enddate = '20110114'

select case when count(distinct a.date1+v.number)
= datediff(d,@startdate, @enddate) + 1
then 'No gaps' else 'Gap' end
from spans A
inner join master..spt_values v
on v.type='P' and v.number between 0 and datediff(d, a.date1, a.date2)
-- we don't care about spans that don't intersect with our range
where A.date1 <= @enddate
and @startdate <= A.date2
-- count only those dates within our range
and a.date1 + v.number between @startdate and @enddate

另一种方法是从 @start 构建日历@end up front 并查看是否有包含此日期的跨度

declare @startdate datetime, @enddate datetime
select @startdate = '20110107', @enddate = '20110114'
-- startdate+v.number is a day on the calendar
select @startdate + v.number
from master..spt_values v
where v.type='P' and v.number between 0
and datediff(d, @startdate, @enddate)

-- run the part above this line alone to see the calendar
-- the condition checks for dates that are not in any span (gap)
and not exists (
select *
from spans
where @startdate + v.number between date1 and date2)

查询返回@start - @end日期范围内的所有空白日期可以添加TOP 1来查看是否存在间隙

要返回间隙之前的所有记录,请使用查询作为较大查询中的派生表

declare @startdate datetime, @enddate datetime
select @startdate = '20110107', @enddate = '20110114'
select *
from spans
where date1 <= @enddate and @startdate <= date2 -- overlaps
and date2 < ( -- before the gap
select top 1 @startdate + v.number
from master..spt_values v
where v.type='P' and v.number between 0
and datediff(d, @startdate, @enddate)
and not exists (
select *
from spans
where @startdate + v.number between date1 and date2)
order by 1 ASC
)

关于sql - 查找一组日期范围中的空白的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4765495/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com