久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

使用一組可能重疊的排除項計算日期范圍內的天

Count days in date range with set of exclusions which may overlap(使用一組可能重疊的排除項計算日期范圍內的天數)
本文介紹了使用一組可能重疊的排除項計算日期范圍內的天數的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

給定以下示例查詢,考慮到這些范圍可能具有重疊的日期,在給定一組要排除的范圍的情況下,計算日期范圍內總天數的可靠且高效的方法是什么?

Given the following example query, what is a sound and performant approach to counting the total days in a date range when also given a set of ranges to exclude, given that those ranges may have dates which overlap?

更簡單地說,我有一個表格,其中包含一組關閉計費的日期范圍,我從一個日期范圍(比如 Jan1 - Jan31)開始,我需要確定該范圍內發生了多少可計費天.只是日期的日期差異減去禁用日期的日期差異的總和.但是,禁用日期范圍有可能重疊,即禁用一條記錄中的 Jan5-Jan8 和另一條記錄中的 Jan7-Jan10 - 因此簡單的總和會使 Jan7 重復計算.排除這些重疊并獲得準確計數的最佳方法是什么?

More simply, I have a table with a set of date ranges where the billing is turned off, I start with a date range (say Jan1 - Jan31) and I need to determine how many billable days occured in that range. Simply a datediff of the days minus a sum of the datediff on the disabled days. However, there is a chance that the disabled date ranges overlap, ie disabled Jan5-Jan8 in one record and Jan7-Jan10 in another record - thus a simple sum would double count Jan7. What is the best way to exclude these overlaps and get an accurage count.

Declare @disableranges table (disableFrom datetime, disableTo datetime)
insert into @disableranges
select '01/05/2013', '01/08/2013' union
select '01/07/2013', '01/10/2013' union
select '01/15/2013', '01/20/2013'

declare @fromDate datetime = '01/01/2013'
declare @toDate datetime = '01/31/2013'

declare @totalDays int = DATEDIFF(day,@fromDate,@toDate)
declare @disabledDays int = (0 /*not sure best way to calc this*/)

select @totalDays - @disabledDays

推薦答案

您可以使用 遞歸 CTE 在 @dateFrom@dateTo 之間生成日期.然后將日期與范圍進行比較,并找到任何范圍內的所有日期.最后,計算結果中的行數以獲取禁用日期的計數(演示):

You can use a recursive CTE to generate dates between @dateFrom and @dateTo. Then compare the dates with the ranges, and find all dates that are in any range. Finally, count the number of rows in the result to get the count of disabled dates (DEMO):

-- recursive CTE to generate dates
;with dates as (
  select @fromDate as date
  union all
  select dateadd(day, 1, date)
  from dates
  where date < @toDate
)

-- join with disable ranges to find dates in any range
, disabledDates as (
  select date from dates D
  left join @disableranges R
    on D.date >= R.disableFrom and d.Date < R.disableTo
  group by date
  having count(R.disablefrom) >= 1
)

-- count up the total disabled dates
select @disabledDays=count(*) from disabledDates;

這篇關于使用一組可能重疊的排除項計算日期范圍內的天數的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Converting Every Child Tags in to a Single Column with multiple Delimiters -SQL Server (3)(將每個子標記轉換為具有多個分隔符的單列-SQL Server (3))
How can I create a view from more than one table?(如何從多個表創建視圖?)
Create calculated value based on calculated value inside previous row(根據前一行內的計算值創建計算值)
How do I stack the first two columns of a table into a single column, but also pair third column with the first column only?(如何將表格的前兩列堆疊成一列,但也僅將第三列與第一列配對?) - IT屋-程序員軟件開發技
Recursive t-sql query(遞歸 t-sql 查詢)
Convert Month Name to Date / Month Number (Combinations of Questions amp; Answers)(將月份名稱轉換為日期/月份編號(問題和答案的組合))
主站蜘蛛池模板: 久久久久久久久久国产 | 深夜福利网 | 国产高清在线视频 | 怡红院亚洲 | 欧美精产国品一二三区 | 岛国av噜噜噜久久久狠狠av | 欧美一级淫片bbb一84 | 欧美做爰xxxⅹ性欧美大片 | 蜜臀久久99精品久久久久久宅男 | 欧美a一级| 九九热视频在线 | 久久网av | 日韩三级一区 | 中文久久久 | 欧美一区 | 久久久久久国产 | 日本三级在线视频 | 波多野结衣视频一区 | 久久久久一区二区 | 三级在线观看视频 | 青草视频在线播放 | 国内av在线 | 欧美vieox另类极品 | 成人免费毛片aaaaaa片 | 精品国产乱码久久久久 | 伊人综合影院 | 精品久久一区二区三区 | 欧美精品www | 天天爽夜夜操 | 黄色片在线看 | 日韩中文字幕精品 | av网站导航 | 中国一级毛片 | 国产福利91精品一区二区三区 | 欧美日韩国产三级 | 久久精品一区二区三区四区五区 | 亚洲国产精品久久 | 日韩综合在线观看 | xxx免费视频 | 成人深夜视频 | 国产做受视频 |