【问题标题】:SQL Server 2012 - Calculating time elapsed during working hours between two datetimes excluding weekendsSQL Server 2012 - 计算两个日期时间之间的工作时间(不包括周末)
【发布时间】:2017-01-05 16:12:10
【问题描述】:

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

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

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

因此,如果一个项目在周五的 16:00:00.000000 分配到周五,并在周一的 10:30:00.000000 解决,那么总经过的时间将是 3 小时或 180 分钟或 10,800 秒。

我看到了一些不包括周末时间但不包括工作时间的帖子 --- 非常感谢任何帮助,谢谢!

【问题讨论】:

  • 工作时间是固定的吗?从不改变?它们是连续的(没有午休时间)吗?
  • 假期呢?
  • 工作时间是固定的,在这种情况下我忽略了假期,谢谢!

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


【解决方案1】:

你可以试试这个:

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

【讨论】:

  • 感谢@Polux2,当我运行它时,我得到了负整数……你能详细说明一下这个语句在做什么吗?谢谢!
  • 您确定使用@d2 > @d1 吗?它在我的电脑上很好用。如果您更喜欢使用分钟而不是小时,则需要将 hh 替换为 mi,将“2*8.5”替换为“2*8.5*60”,将“(24-8.5)”替换为“(24-8.5)*60”
【解决方案2】:

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

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

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

假设我们有两个日期时间值,@Date1 和@Date2。我们假设@Date1

如果@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 * @SecondsPerDay) + (@firstWeekDays * @SecondsPerDay) + (@Date1 和 @Date1 下午 5:30 之间的秒数) + (@lastWeekDays * @SecondsPerDay) + (@lastMorning 和 @Date2 之间的秒数)

请注意,此逻辑尚未使用代码进行测试:如果有,我会给您代码。 :)

【讨论】:

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