首页 文章

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

提问于
浏览
1

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

澄清方案的示例

我们在where子句中的给定日期范围是1/02/17和5/2/17

乔于2017年2月1日上午9点开车预订,并于2017年2月1日下午5点归还...包括8小时预订 .

我们在where子句中的给定日期范围是19/02/17和20/2/17

2017年2月19日上午9点的Trish书车,并于2017年2月21日下午5点返回...仅包括16小时预订(即19日和20日),因为第3天超出我们的日期范围终点20 / 02/2017 .

我们在where子句中的给定日期范围是1/02/17和5/2/17

汤姆在2017年1月31日上午9点开车预订,并于2017年2月1日中午12点返回...仅包括3小时预订(即2月1日半天),因为第1天(即1月31日)跌倒在我们的日期范围之外的起点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 回答

  • 1

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

    之后你只需要检查:

    • 如果开始日期与日历日期相同 - >检查从开始时扣除的可能时间

    • 如果结束日期与日历日期相同 - >检查从结尾扣除的可能小时数

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

相关问题