【问题标题】:Calculate the working hours between two dates in sql server excluding weekend计算sql server中两个日期之间的工作时间,不包括周末
【发布时间】: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


【解决方案1】:

如果您首先创建一个日历表,每个日期只有一行,那么执行此操作会简单得多。然后您可以使用它来过滤周末,​​并且您将在预订有效的每一天得到一行。

之后你只需要检查:

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

如果那是您的工作日,那么只需将所有其他天数加起来为 8 小时。

【讨论】:

    猜你喜欢
    • 2017-01-05
    • 1970-01-01
    • 2017-10-09
    • 2016-01-17
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多