计算除周末之外的sql server中两个日期之间的工作时间

时间:2017-02-24 22:33:13

标签: sql sql-server date datetime join

我正在租用一个租车系统数据库,在那里租车。我需要计算一个汽车在给定日期时间范围内的贷款总时间(仅限工作时间和周末除外)。

阐明方案的示例

我们在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之间找到日期

1 个答案:

答案 0 :(得分:1)

如果您首先创建一个日历表,每个日期有一行,那么这样做会更简单。您可以使用它来过滤掉周末,并且在预订有效的每一天,您将得到一行。

之后你只需要检查:

  • 如果开始日期与日历日期相同 - &gt;检查可能从一开始就扣除的时间
  • 如果结束日期与日历日期相同 - &gt;检查可能从最后扣除的时间

如果那是你的工作日,那就把所有其他日子加上8小时。