【问题标题】:Time completion in working hours工作时间完成时间
【发布时间】:2011-11-01 02:26:23
【问题描述】:

好吧,与其说是编程问题,但我似乎只能想到非常复杂的方法来解决这个问题。

我们在办公室运行了一个脚本。我们需要确定此脚本仅在工作时间(工作时间为上午 9 点至下午 5 点)中需要多长时间。例如,假设脚本在星期一下午 2 点开始,在星期二下午 4 点结束。完成此脚本需要 26 小时,但只需 10 小时即可完成。这个脚本可以在一个工作日内完成,但也可以跨越很多天。该脚本只能在一个工作日内开始和结束。时间戳以 Unix 格式完成。

我不知道如何在 SQL 中做到这一点,但我知道网络管理员更喜欢这个。

服务器端脚本语言是 PHP。所以这将是第二个可用的选项。我的尝试如下:

$workingDay = 24;
$workingDayHours = 8;
$workingTime = 0;

while($timeTaken >= $workingDay) {
  $workingTime += $workingDayHours;
  $timeTaken -= $workingDay;
}
$workingTime += $timeTaken;

我现在真的不能好好思考,工作太多了,所以虽然这个方法很愚蠢,但它似乎在这种情况下工作,因为 $timeTaken 总是 = 24。

无论如何,很高兴看到一种更好、更智能的方法(也许可以在任意小时内工作)。 SQL 也很棒。

【问题讨论】:

  • 如果脚本没有在工作日下午 5 点之前完成,会发生什么情况?是否暂停并在第二天早上 9 点恢复?或者它会继续 - 在这种情况下,如果它在晚上 9 点结束会发生什么?
  • 周末怎么样?周五下午 4 点开始脚本,周六和周日运行,周一上午 9 点结束,算作 2 小时?
  • @aleks-g 好吧,我不知道系统是如何组合在一起的,但显然时间戳只能在上午 9 点和下午 5 点之间。脚本不会在这些时间之外完成。
  • 该死的新人按回车发表评论,真烦人...
  • @arnep 嗯,周末是我没想到的。如果脚本从下午 4 点开始并在上午 9 点结束,则该脚本应计为 1 小时。但是,我发布的脚本不会那样工作:P

标签: php mysql time timestamp


【解决方案1】:

这样的事情(仅当工作在 9:00-17:00 之间开始和完成时才有效)... (未测试抱歉)

经过的持续时间(以小时为单位):

 HOUR(TIMEDIFF(enddatetime-startdatetime))

计算工时数:

我们需要删除作业未运行的 n 个 16 小时时段, (任何运行超过 16 小时的作业必须运行超过 n 天)

duration - (FLOOR(duration/16)*16)

得到:

SELECT HOUR(TIMEDIFF(enddatetime-startdatetime)) - 
          (FLOOR(HOUR(TIMEDIFF(enddatetime-startdatetime))/16)*16) AS duration

如果您想删除周末,您可以简单地查看开始和结束的周数,如果它们不一样,请删除 48 小时(作业结束的每个周末),然后从上述持续时间中删除此值

(week(enddatetime,1) - week(startdatetime,1)) * 48

【讨论】:

  • 这会在晚上 7 点到 20 点之间返回 3,应该是 0。
  • 此外,如果运行时间是下午 4 点到第二天早上 7 点,您的公式会返回 0 (15-15),而它应该是 1。
  • 你说的很对,只有工作在工作时间(9-5)开始和结束时才会起作用,但请参阅 Carls cmets 先生:'显然时间戳只能在上午 9 点和下午 5 点之间.脚本将不会在这些时间之外完成
猜你喜欢
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多