计算重叠日期范围的价格

PaR*_*RaJ 11 sql sql-server

我有一个名为HotelRate的简单表

HID  |  START_DATE  |   END_DATE    |   PRICE_PER_DAY
--------------------------------------
1        01/1/2015       10/1/2015       100
1        11/1/2015       20/1/2015       75
1        21/1/2015       30/1/2015       110
Run Code Online (Sandbox Code Playgroud)

什么是最简单的方法来计算价格的酒店房间之间是否为总价用户查询5/1/201525/1/2015.

我检查过 :

但这对我来说都没有多大意义.

我已经尝试了几个查询,但这些看起来像是在盲人中击中箭头.有人可以建议我一个简单而优雅的方法吗?


@JamesZ

在运行第一个查询时,我得到了

start_date end_date   duration    price_per_day
---------- ---------- ----------- -------------
2015-01-01 2015-01-10 5           100
2015-01-11 2015-01-20 9           75
2015-01-21 2015-01-30 4           110
Run Code Online (Sandbox Code Playgroud)

对于第一个范围5是可以的,它应该是第二个范围10,第三个是5

如何计算天数:startend日期之间的总夜数,与天差相同

05-Jan-15   06-Jan-15   1 Night
06-Jan-15   07-Jan-15   1 Night
07-Jan-15   08-Jan-15   1 Night
08-Jan-15   09-Jan-15   1 Night
09-Jan-15   10-Jan-15   1 Night
10-Jan-15   11-Jan-15   1 Night
11-Jan-15   12-Jan-15   1 Night
12-Jan-15   13-Jan-15   1 Night
13-Jan-15   14-Jan-15   1 Night
14-Jan-15   15-Jan-15   1 Night
15-Jan-15   16-Jan-15   1 Night
16-Jan-15   17-Jan-15   1 Night
17-Jan-15   18-Jan-15   1 Night
18-Jan-15   19-Jan-15   1 Night
19-Jan-15   20-Jan-15   1 Night
20-Jan-15   21-Jan-15   1 Night
21-Jan-15   22-Jan-15   1 Night
22-Jan-15   23-Jan-15   1 Night
23-Jan-15   24-Jan-15   1 Night
24-Jan-15   25-Jan-15   1 Night
               Count : 20 Night
Run Code Online (Sandbox Code Playgroud)

Jam*_*s Z 7

像这样的东西应该做的伎俩:

declare @startdate date, @enddate date

set @startdate = '20150105'
set @enddate = '20150125'

select
  start_date,
  end_date,
  datediff(
    day, 
    case when @startdate > start_date then @startdate else start_date end, 
    case when @enddate < end_date then @enddate else end_date end) as duration,
  price_per_day
from
  reservation
where
  end_date >= @startdate and
  start_date <= @enddate
Run Code Online (Sandbox Code Playgroud)

这只是处理重叠范围与大小写,以便如果预订开始是正确的使用,它需要它,否则搜索标准,和结束日期相同的事情.日期和价格在这里是分开的,但您可以将它们相乘以获得结果.

SQL小提琴:http://sqlfiddle.com/#!3/4027b3/1

编辑,这样得到总和:

declare @startdate date, @enddate date

set @startdate = '20150105'
set @enddate = '20150125'

select
  sum(datediff(
    day, 
    case when @startdate > start_date then @startdate else start_date end, 
    case when @enddate < end_date then @enddate else end_date end)  
  * price_per_day)
from
  reservation
where
  end_date >= @startdate and
  start_date <= @enddate
Run Code Online (Sandbox Code Playgroud)