【问题标题】:How do I advance a date timestamp forward to the beginning of the next work day if the timestamp occurs outside of working hours?如果时间戳发生在工作时间之外,如何将日期时间戳提前到下一个工作日的开始?
【发布时间】:2020-08-14 12:56:07
【问题描述】:

我有一个日期时间戳列表,如果任何时间发生在我们的工作时间之外,我需要将它们提前到下一个工作日的开始。 我们的工作时间是 M-F 8:30am-5:30pm,周六 8:30am-1:30pm,周日休息,节假日也休息。 例子:

  1. 2020 年 6 月 26 日星期五下午 6:30 应提前到 2020 年 6 月 27 日星期六上午 8:30
  2. 2020 年 7 月 3 日星期五下午 6:30 应提前至 2020 年 7 月 6 日星期一上午 8:30。因为周六是节假日,周日休息。
  3. 2020 年 7 月 3 日星期五下午 5:29 不应提前,因为它是在工作时间开始的
    Column A |Column B | Column C | Column B | Column E
    Underwriter | LoanNumber | EntryTime_+3hrs | Desired Outcome | HOLIDAY
    TOM    | 1 | 07/31/2020 8:28:42 AM | 08/01/2020 8:30:00 AM | 01/01/2020
    DICK   | 2 | 07/30/2020 6:32:36 PM | 07/31/2020 8:30:00 AM | 01/20/2020
    JANE   | 3 | 07/30/2020 4:18:57 PM | 07/30/2020 4:18:57 PM | 02/17/2020
    BETH   | 4 | 07/30/2020 3:06:18 AM | 07/30/2020 8:30:00 AM | 05/25/2020
    SALLY  | 5 | 07/29/2020 6:35:37 PM | 07/30/2020 8:30:00 AM | 07/04/2020
    GEORGE | 6 | 07/03/2020 7:45:26 PM | 07/06/2020 8:30:00 AM | 09/07/2020
           |   |                       |                       | 10/12/2020
           |   |                       |                       | 11/11/2020
           |   |                       |                       | 11/26/2020
           |   |                       |                       | 12/24/2020
           |   |                       |                       | 12/25/2020

【问题讨论】:

  • @BigBen 我刚刚想出了如何添加图片。好主意。谢谢。
  • 文本数据可以复制粘贴更好,但图片总比没有好。
  • 这样更好吗?
  • 那好极了。我是一名工程师(发音为硬 G)而不是艺术专业!我保留自己编造言论的权利。
  • Tom 的开始时间应该改为 07/31/20 8:30 AM 因为 7 月 31 日是星期五?下一个可用时间段是 2 分钟后?

标签: excel excel-formula


【解决方案1】:

需要验证开始日期时间戳并将其转换为下一个可用时间段。

目前的想法是你有三个潜在的结果:

  • 从 0830 开始,日期需要移到下一个可能的日期
  • 日期将保持不变,但时间将移至 0830
  • 日期和时间有效,无需调整。

所以一个通用公式可能看起来像这样:

IF(OR(HOLIDAY,SUNDAY,AFTERHOURS),FIND NEXT WORKDAY,
IF(BEFORE WORKHOURS, SET TIME TO START TIME, ITS VALID TIME))

为了单独检查每个条件是否有可能的白班,我们可以使用以下公式:

(ASSUME C2 is the start date being tested)

WEEKDAY AFTER 1730
=AND(MOD(C2,1)>TIME(17,30,0),OR(WEEKDAY(C2)={2,3,4,5,6}))

SATURDAY AFTER 1330
=AND(MOD(C2,1)>TIME(13,30,0),WEEKDAY(C2)=7)

HOLIDAY (list in E2:E12)
=COUNTIF($E$2:$E$12,INT(C2))=1

SUNDAY
=WEEKDAY(C2)=1

前两个公式中的 MOD 函数是去除整数/日期值,只保留小数/时间部分

{ } 是一个手动列表/数组,它是一种很好的方式来执行多个 OR 检查,而无需写出每个单独的检查。由于这些是连续的,因此您还有其他选择。

现在有一种标记每个案例的方法,所以现在只需重新排列和组合在一起,这样您就可以在嵌套的 IF 函数中进行三个选择:

=IF(OR(AND(MOD(C2,1)>TIME(17,30,0),OR(WEEKDAY(C2)={2,3,4,5,6})),AND(MOD(C2,1)>TIME(13,30,0),WEEKDAY(C2)=7), COUNTIF($E$2:$E$12,INT(C2))=1, WEEKDAY(C2)=1), FIND NEXT DATE, IF(BEFORE WORK, SET TIME TO 0830, DO NOTHING))

由于每个有效日期都从 0830 开始,并且第一个 IF 已经处理了无效日期,因此只需要检查开始时间。

=MOD(C2,1)<TIME(08,30,00)

有效时间是唯一剩下的情况,所以没有什么要检查的。

你的伪公式变成这样的:

=IF(OR(AND(MOD(C2,1)>TIME(17,30,0),OR(WEEKDAY(C2)={2,3,4,5,6})),AND(MOD(C2,1)>TIME(13,30,0),WEEKDAY(C2)=7), COUNTIF($E$2:$E$12,INT(C2))=1, WEEKDAY(C2)=1), FIND NEXT DATE, IF(MOD(C2,1)<TIME(08,30,00), SET TIME TO 0830, DO NOTHING))

所以现在你只需要弄清楚如何增加一些日子,改变时间,并保持你所拥有的价值。

调整要添加的天数让我看到多个嵌套的 IF 等于可能无效的连续天数。现在我有最坏的情况是星期四 17:31 开始。周五因周六放假而放假,周日为放假,周一因周日放假而放假。所以第一个潜在的日子将是 5 天之后。丑陋的嵌套 IF。作为替代方案,我查看了 AGGREGATE 并一次添加 1 天,最多 5 天,并检查它是否是有效日期。然后取最低/最早日期并将开始时间设置为 0830。为此,我尝试了以下公式:

=AGGREGATE(15,6,(INT(C2)+{1,2,3,4,5})/((COUNTIF($E$2:$E$12,(INT(C2)+{1,2,3,4,5}))<1)*(WEEKDAY(C2+{1,2,3,4,5})<>1)),1)+TIME(8,30,0)

那么你需要做的下一个功能是保留日期,但将时间设置为 08:30

=INT(C2)+TIME(08,30,00)

而你什么都不做是:

=C2

所以现在如果我们将其中的废话组合成一个公式,我们最终会得到:

=IF(OR(AND(MOD(C2,1)>TIME(17,30,0),OR(WEEKDAY(C2)={2,3,4,5,6})),AND(MOD(C2,1)>TIME(13,30,0),WEEKDAY(C2)=7), COUNTIF($E$2:$E$12,INT(C2))=1, WEEKDAY(C2)=1), AGGREGATE(15,6,(INT(C2)+{1,2,3,4,5})/((COUNTIF($E$2:$E$12,(INT(C2)+{1,2,3,4,5}))<1)*(WEEKDAY(C2+{1,2,3,4,5})<>1)),1)+TIME(8,30,0), IF(MOD(C2,1)<TIME(08,30,00), INT(C2)+TIME(08,30,00), C2))

我认为 D2(红色背景)中所需的日期是错误的,应该是 20/07/31 08:30

参考您之前的问题

现在理论上,这可以代替第一个公式中的每个 B2 引用,但是 A) 事情会变得比现在更加难以阅读和维护,并且 B) 可能会导致多次重复计算。

【讨论】:

  • 使用一系列列和公式我已经解决了这个问题。这是一场噩梦。如果我能弄清楚如何发送直接消息,我很乐意分享。
  • @theteague 在此系统中没有直接消息传递。我对红色时间错误的理解是否正确?
  • 是的,这是正确的。我基本上按照你说的做了。在一个专栏中,我确定了必要的行动——提前开始下一个工作日的时间,提前开始同一工作日的时间,或者不采取任何行动。从那里我确定了输入日 +1 和响应日期 -1 之间的星期六和常规天数,不包括星期日和节假日。然后我根据修改后的开始时间确定了进入日期的分钟数。然后我确定了计算响应日期的分钟数。最后,我将第一天的分钟数、当天的分钟数和最后一天的分钟数相加。
  • 这很丑,但它是正确的,我可以继续保持下去。我真的很感激帮助。我希望尽快付款。
猜你喜欢
  • 2023-03-31
  • 2014-05-22
  • 1970-01-01
  • 2020-12-10
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 2011-08-07
相关资源
最近更新 更多