Sql 如果存在多个日期间隔,如何找到给定日期之间的最佳匹配日期间隔

Sql 如果存在多个日期间隔,如何找到给定日期之间的最佳匹配日期间隔,sql,Sql,我有两张表,一张是入住结账日期和其他客户信息,另一张是房价,房间类型,酒店id,以及从何时到何时房价有效的日期。现在的问题是,如果费率表有三个开始日期和结束日期,并且签入日期位于其中三个日期范围内,那么它会显示三条记录,而要求是它应该选择最近的开始日期,例如 start date end date room rate 2013-10-01 2014-03-31 2000 2013-11-01 2013-12-20 2500 2013-12-21 2013-12-31 3000

我有两张表,一张是入住结账日期和其他客户信息,另一张是房价,房间类型,酒店id,以及从何时到何时房价有效的日期。现在的问题是,如果费率表有三个开始日期和结束日期,并且签入日期位于其中三个日期范围内,那么它会显示三条记录,而要求是它应该选择最近的开始日期,例如

start date  end date   room rate  
2013-10-01  2014-03-31 2000
2013-11-01  2013-12-20 2500
2013-12-21  2013-12-31 3000
登记日期为2013年12月25日,应显示日期范围仅为3的记录,最适合该日期 下面是我的sql查询 `

 select b.*, r.* from(select a.Enquiry_Id,a.Ckeck_In,a.check_Out,a.Place,a.Hotel_Name,a.Meal_Plan,a.Room_Type,a.Occupancy_Type,a.Extra_Bed,a.Room_QT,h.grade,
 h.addres, h.Hotel_ID, a.ChildWithBed,a.childAgeWithoutBed,
 a.Inclusion, a.No_Night from Accomodation a inner join hotel h on
 a.Hotel_Name = h.Hotel_Name where a.Enquiry_Id = '0128201408') b inner
 join  RoomType r on b.Hotel_ID = r.Hotel_ID where r.Name = b.Room_Type
 and b.Ckeck_In between r.StartSeason and r.EndSeason order by Ckeck_`In
试着这样做:

with (
    select 
        a.Enquiry_Id,a.Ckeck_In,a.check_Out,a.Place,
        a.Hotel_Name,a.Meal_Plan,a.Room_Type,
        a.Occupancy_Type,a.Extra_Bed,a.Room_QT,h.grade,
        h.addres, h.Hotel_ID, a.ChildWithBed,a.childAgeWithoutBed,
        a.Inclusion, a.No_Night 
    from Accomodation a 
    join hotel h on
        a.Hotel_Name = h.Hotel_Name 
    where 
        a.Enquiry_Id = '0128201408'
) temp
select
    temp.*, r.*
from temp
join (
    select 
        r.Hotel_ID, temp.Enquiry_Id, min(datediff(day, r.StartSeason, temp.Check_In)) MinDateDiff
    from temp
    join RoomType r on 
        temp.Hotel_ID = r.Hotel_ID 
    where 
        r.Name = temp.Room_Type
        and temp.Ckeck_In between r.StartSeason and r.EndSeason
    group by
        r.Hotel_ID, temp.Enquiry_Id
) x on
    temp.Enquiry_Id = x.Enquiry_Id
    and temp.Hotel_ID = x.Hotel_ID
join RoomType r on 
    x.Hotel_ID = r.Hotel_ID 
where 
    r.Name = temp.Room_Type
    and temp.Ckeck_In between r.StartSeason and r.EndSeason
    and datediff(day, r.StartSeason, temp.Check_In) = x.MinDateDiff
order by
    temp.Check_In
我正在计算StartSeson和Check_In之间的min datediff,将其放入子查询中,然后依靠此datediff仅获取最近的记录。
我可能会在子查询分组和最外层连接中出错。如果需要,只需检查并更正即可。

费率是否总是这样列出,先列出基本价格,然后列出特定时期的附加价格?在这种情况下,您可以将其与最高价格匹配?那么,在您的查询中有什么不起作用呢?考虑建立SqLFIDDL.com。我无法匹配最高的价格,我总是与签入日期和季节日期相匹配。例如,如果签入日期为25 OCT,我的CNT将有效率为1NOV至31 DEC,VISAVESA,如果签入日期为25 DEC,则CNT选择OCT月份的费率。使用3个日期板记录任何加入签入日期的日期。