假設沒有重疊範圍定義,並且假設所有給定的意在爲包括性的範圍的,我們可以使用獲得的數據CTE然後一個簡單的聚合問題:
declare @t table (date_from date,date_to date, price_per_room int)
insert into @t (date_from,date_to,price_per_room) values
('20170901','20170910',70.00),
('20170911','20170920',100.00)
declare @Start date
declare @End date
select @Start = '20170907',@End = '20170915'
;With IncludedPeriods as (
select
CASE WHEN @Start > date_from THEN @Start ELSE date_from END as fromDT,
CASE WHEN @End < date_to THEN @End ELSE date_to END as ToDT,
price_per_room
from
@t
where
date_from <= @End and
@Start <= date_to
)
select
SUM(price_per_room * (1 + DATEDIFF(day,fromDT,ToDT)))
from
IncludedPeriods
注意,我們要添加一個到DATEDIFF
結果,因爲它計算過渡,但我假設一段從「20170911」 到「20170911」應該算作一天,同樣更長的時間。
不像其中一些試圖枚舉各種「箱子」爲重疊其他的答案的,這裏採用的簡單的規則 - 兩個週期重疊,如果第二前的第一次啓動結束和如果第一端部之前的第二開始 - 這是CTE內where
條款中應用的邏輯。爲了確定重疊的範圍,我們選取兩個開始日期中較晚的一個和兩個結束日期中較早的一個 - 這就是CASE
表達式正在做的事情。如果我們在日期上使用了標量MIN
和MAX
函數,我寧願使用這些函數,但沒有內置到SQL Server中的函數。
請不要使用不適用於您的問題的標籤。我刪除了數據庫標記,因爲它不清楚你實際使用了哪一個。請添加僅*的標籤*您實際使用的數據庫 –
在[所以]您應該嘗試**自己編寫代碼**。後** [做更多的研究](//meta.stackoverflow.com/questions/261592)**如果你有問題,你可以**發佈你已經嘗試**與清楚的解釋是什麼是'工作**並提供[** Minimal,Complete和Verifiable示例**](// stackoverflow.com/help/mcve)。我建議閱讀[問]一個好問題和[完美問題](http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/)。另外,一定要參加[遊覽]並閱讀[this](// meta.stackoverflow.com/questions/347937/)**。 –
我們保證要查詢的所有日期將覆蓋行並且不存在重疊行(即從未需要提供默認值或用於消除行歧義的規則)? –