【发布时间】:2017-02-24 22:33:13
【问题描述】:
我正在研究一个租赁系统数据库,其中提供汽车租赁。我需要计算给定日期时间范围内仅工作时间且不包括周末的汽车总贷款时间(时差总和)。
阐明场景的示例
where 子句中给定的日期范围是 1/02/17 和 5/2/17
Joe 于 2017 年 1 月 2 日上午 9 点预订了一辆车,并于 2017 年 1 月 2 日下午 5 点还车……包括 8 小时预订。
where 子句中给定的日期范围是 19/02/17 和 20/2/17
Trish 于 2017 年 2 月 19 日上午 9 点预订汽车,并于 2017 年 2 月 21 日下午 5 点还车……仅包括 16 小时预订(即 19 日和 20 日),因为第 3 天不在我们的日期范围终点2017 年 2 月 20 日。
where 子句中给定的日期范围是 1/02/17 和 5/2/17
Tom 于 2017 年 1 月 31 日上午 9 点预订汽车,并于 2017 年 1 月 2 日下午 12 点还车……仅包括 3 小时预订(即 2 月 1 日的 ½ 天),作为第 1 天(即 31 日) Jan) 不在我们的日期范围起点 01/02/2017
如果任何列的值不同(即公司名称、贷款车辆登记、服务顾问或驾驶员车牌),那么这将是唯一的行。但是,如果这些列都相同并且唯一的区别是预订日期(即,如果乔在日期范围内两次预订同一辆车,使用相同的公司、服务顾问和司机车牌),那么应该是分组/计算为一个记录行。
我当前的存储过程是
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 之间的日期差异
【问题讨论】:
-
@tavnab 请研究整个问题。
-
查看stackoverflow.com/questions/252519 作为您计算两个日期之间的工作日数的起点,然后为您的边缘情况添加小时数(即,将您的开始日期向上取整,四舍五入您的结束日期向下,使用这些来获取工作日数,如果您的开始/结束日期是工作日,则将您在任一端丢失的工作日小时数加上以获得您的总小时数)
-
我不想得到一周的工作时间请研究整个问题@tavnab
-
你真的应该用一个单一的搜索条件和所有案例的预期结果来做一个例子(带有数据,最好是插入子句)。通过更改每个步骤的搜索条件,您只是让这变得过于复杂
标签: sql sql-server date datetime join