我正在租用一个租车系统数据库,在那里租车。我需要计算一个汽车在给定日期时间范围内的贷款总时间(仅限工作时间和周末除外)。
阐明方案的示例
我们在where子句中的给定日期范围是1/02/17和5/2/17
Joe于2017年2月1日上午9点预订了一辆车,并于2017年2月1日下午5点返回...包括8小时预订。
我们在where子句中的给定日期范围是19/02/17和20/2/17
2017年2月19日上午9点开始上车,并于2017年2月21日下午5点归还...仅限16小时预订(即19日和20日),因为第3天超出了我们的日期范围结束2017/02/02。
我们在where子句中的给定日期范围是1/02/17和5/2/17
Tom于2017年1月31日上午9点开车预订,并于2017年2月1日中午12点归还...仅限3小时预订(即2月1日半天),即第1天(即31日) Jan)超出了我们日期范围的起点01/02/2017
如果任何列值不同(即公司名称,贷款车辆登记,服务顾问或驾驶号码牌),那么这将是一个唯一的行。但是,如果这些列完全相同,唯一的区别是预订日期(即,如果Joe在日期范围期间内使用同一公司,服务顾问和驱动程序编号牌两次预订同一辆车),那么应该是分组/计算为一条记录行。
我当前的存储过程是
ALTER PROCEDURE [dbo].[bookingAnalysis]
@from_date nvarchar(50)=NULL,
@to_date nvarchar(50)=NULL
AS
BEGIN
SET NOCOUNT ON;
Select cmp.CompanyName,v.NumberPlate as Loan_Vehicle_Registration,m.ModelDescription as Vehicle_Description,
cnt.FirstName,cnt.LastName,DATEDIFF(HOUR,b.DueOutDate,b.ActualReturnedDate)as
Duration_of_Loan,b.bookingID,b.DriversNumberPlate from Bookings as b
inner join Companies as cmp on b.AssignedCompanyID=cmp.CompanyID
inner join Vehicles as v on v.VehicleID=b.VehicleID
inner join Models as m on m.ModelID=v.ModelID inner join Contacts
cnt on cnt.ContactID=b.ContactID where b.DueOutDate>= @from_date and b.ActualReturnedDate<= @to_date
END
目前我正在b.DueoutDate和b.ActualReturnDate之间找到日期
答案 0 :(得分:1)
如果您首先创建一个日历表,每个日期有一行,那么这样做会更简单。您可以使用它来过滤掉周末,并且在预订有效的每一天,您将得到一行。
之后你只需要检查:
如果那是你的工作日,那就把所有其他日子加上8小时。