SQL Server 2012 - 计算在两个日期时间(不包括周末)之间的工作时间内经过的时间

时间:2016-08-29 15:06:01

标签: sql-server tsql datetime sql-server-2012 elapsedtime

我有一张表格,其中指定了日期(日期时间)和已解决的日期(日期时间)。

我正在尝试计算工作时间和周末不包括的时间(以秒为单位)。

工作时间为周一至周五09:00:00.000000至17:30:00.000000。

因此,如果项目在星期五的16:00:00.000000分配,并在周一10:30:00.000000解决,则总耗用时间为3小时或180分钟或10,800秒。

我看到一些帖子排除了周末时间而不是工作时间---非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

select datediff(hh, @d1, @d2) - (datediff(wk, @d1, @d2) * 2 * 8.5) - datediff(dd, @d1, @d2) * (24-8.5)  

答案 1 :(得分:0)

虽然可以在单个表达式中完成所有这些操作,但我不会尝试这样做。太多潜在的人为错误(包括转录错误),非常冗长,并且难以调试或修改。

相反,如果我不得不返回已经计算过的数据集,我会在T-SQL中将其作为用户定义的函数。如果我要显示它或生成包含此信息的报告,我会考虑在代码中执行此操作。但是用户定义的T-SQL函数将是最灵活的解决方案,我将授予它。

我手头还没有这样的东西,所以我会给你一个算法。

  

假设我们有两个日期时间值,@ Date1和@ Date2。我们假设@ Date1< @日期2。我们还假设@ Date1和@ Date2都在工作日和工作时间内。

     

如果@ Date1和@ Date2在同一天,请返回@ Date1和@ Date2之间的秒数差异。

     

让@firstMorning成为@ Date1之后的第一个上午9点。如果@ Date1是在上午9点,那么@ firstMorning = @ Date1。

     

让@lastMorning成为@firstMorning之后和@ Date2之前的最后9点。 (基本上是@ Date2的开始时间。)

     

让@workWeeks = @firstMorning和@lastMorning之间的周一至周五周数。

     

让@firstWeekDays = @firstMorning +同周周五上午9:00之间的天数。如果@firstMorning =星期五上午9:00,请将@firstWeekDays设置为0。

     

让@lastWeekDays =上周一上午9:00到@lastMorning之间的天数。如果@lastMorning =星期一上午9:00,请将@lastWeekDays设置为0。

     

让@SecondsPerDay = 8.5 * 3600。

     

返回(@workWeeks * 5 * @SecondPerDay)+       (@firstWeekDays * @SecondPerDay)+(@ Date1和@ Date1之间的5:30之间的秒数)+(@lastWeekDays * @SecondPerDay)+(@lastMorning和@ Date2之间的秒数)

请注意,此逻辑尚未经过代码测试:如果有,我会给你代码。 :)