Sql 如果存在多个日期间隔,如何找到给定日期之间的最佳匹配日期间隔
我有两张表,一张是入住结账日期和其他客户信息,另一张是房价,房间类型,酒店id,以及从何时到何时房价有效的日期。现在的问题是,如果费率表有三个开始日期和结束日期,并且签入日期位于其中三个日期范围内,那么它会显示三条记录,而要求是它应该选择最近的开始日期,例如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
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个日期板记录任何加入签入日期的日期。