2011-01-22 44 views
5

什麼是查找一組日期跨度中的空白的方法?找到一組日期間隔的差距的好方法是什麼?

例如,我有這些日期跨度:

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

然後我有11年1月7日和11年1月14日的開始和結束日期。

我希望能夠告訴大家,11年1月10日和11-1-13之間還有一定的差距,因此開始和結束日期是不可能的。或者我只想返回遇到第一個缺口的日期盤。

如果能在那太好了SQL服務器來完成。

我想仔細檢查每一個日期,以找出是否落地的地點在datespan ...如果它不那麼有那一天一定的差距。

回答

2
  • 跳轉到2日最後代碼塊爲:*I want to be able to tell that between 1/10/11 and 1/13/11 there is a gap so the start and end date is* 不可能的。
  • 跳轉到最後的代碼塊爲:*I want to return only the datespans up to the first gap encountered.*

首先,這裏是一個虛擬表,討論

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 

有了這個查詢,我們現在可以測試看看是否有任何ga ps的,由 數着日子在日曆天對

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 

的預期數量的另一種方式做,這是剛剛修建從@啓動 日曆@end前面,並看看是否有與此日期

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) 

查詢跨度返回所有日期是在日期範圍@啓動差距 - @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 
) 
1

假設MySQL的,像這樣的工作:

select @olddate := null; 

select start_date, end_date, datediff(end_date, @olddate) as diff, @olddate:=enddate 
from table 
order by start_date asc, end_date asc 
having diff > 1; 

基本上是:緩存前一行的END_DATE在@olddate變量,然後做與currel結束日期是「老」的價值差異。具有子句只會返回兩行之間的差異大於一天的記錄。

免責聲明:沒有測試過這一點,但基本查詢結構應該工作。

1

我希望能夠告訴 11年1月10日和11-1-13之間存在差距如此 開始和結束日期不是 可能。

我想你在問這個問題:表中的數據在開始日期和結束日期之間是否有差距?

我創建了一個列的表,DATE_SPAN,並插入您的日期涵蓋進去。

您可以通過計算起始日期和結束日期之間的天數,以及比較確定的空隙,在DATE_SPAN行對同一範圍內的數量。

select 
    date '2011-01-14' - date '2011-01-07' + 1 as elapsed_days, 
    count(*) from date_span 
where cal_date between '2011-01-07' and '2011-01-14'; 

回報

elapsed_days count  
--   -- 
8   6 

因爲他們不是平等的,有一個在2011-01-07 2011-01-14和之間的表 「DATE_SPAN」 的空白。我現在就停下來,因爲我真的不確定你想要做什麼。

相關問題