我有一个名为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/2015
到25/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
如何计算天数:start
与end
日期之间的总夜数,与天差相同
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)
像这样的东西应该做的伎俩:
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)
归档时间: |
|
查看次数: |
759 次 |
最近记录: |