根据时间和特定日期分配一个值(2 个不同的变量)

Assign a value based on time and specific day (2 different variables)

我正在尝试根据 sheet 中记录的时间和日期将特定的工作班次字母分配给新列。

我创建了 2 个新字段以使计算更容易。

我要使用的班次字母如下:

以下是我所做的,代码有效,但仅适用于班次 A、B 和 C。我无法使其工作,因此,它还包括 WD 和 WN。

=IF(AND([@[Hour of Day]]>=6,[@[Hour of Day]]<14,OR([@WeekDay]=1,[@WeekDay]=2,[@WeekDay]=3,[@WeekDay]=4,[@WeekDay]=5)),"A",
IF(AND([@[Hour of Day]]<22,[@[Hour of Day]]>=14,OR([@WeekDay]=1,[@WeekDay]=2,[@WeekDay]=3,[@WeekDay]=4,[@WeekDay]=5)),"B",
IF(AND([@[Hour of Day]]>=22,[@[Hour of Day]]<6,OR([@WeekDay]=1,[@WeekDay]=2,[@WeekDay]=3,[@WeekDay]=4,[@WeekDay]=5)),"C",
IF(AND([@[Hour of Day]]>=6,[@[Hour of Day]]<18,OR([@WeekDay]=6,[@WeekDay]=7)),"WD",
IF(AND([@[Hour of Day]]>18,[@[Hour of Day]]>0,[@[Hour of Day]]<6,OR([@WeekDay]=6,[@WeekDay]=7)),"WN","C")))))

你的最后一个 IF 条件是错误的。您有 Hour > 18 和 Hour < 6,这是永远不会满足的。您需要将其分成两个 if 语句。如果 Day = 6 或 7 且 Hour > 18,则 WN,否则如果 Day = 7 或 1 且 Hour < 6,则

=IF(AND([@[Hour of Day]]>=6,[@[Hour of Day]]<14,OR([@Weekday]=1,[@Weekday]=2,[@Weekday]=3,[@Weekday]=4,[@Weekday]=5)),"A",
IF(AND([@[Hour of Day]]<22,[@[Hour of Day]]>=14,OR([@Weekday]=1,[@Weekday]=2,[@Weekday]=3,[@Weekday]=4,[@Weekday]=5)),"B",
IF(AND([@[Hour of Day]]>=22,[@[Hour of Day]]<6,OR([@Weekday]=1,[@Weekday]=2,[@Weekday]=3,[@Weekday]=4,[@Weekday]=5)),"C",
IF(AND([@[Hour of Day]]>=6,[@[Hour of Day]]<18,OR([@Weekday]=6,[@Weekday]=7)),"WD",
IF(AND([@[Hour of Day]]>=18,OR([@Weekday]=6,[@Weekday]=7)),"WN",
IF(AND([@[Hour of Day]]<6,OR([@Weekday]=1,[@Weekday]=7)),"WN","C"))))))

更新

考虑到@Jaquez指出的你原公式的缺陷,我得出了这个公式。

=IF((FLOOR((([@Weekday]*24+[@[Hour of Day]]-6)+7*24)/24,1))<6,CHOOSE(ROUNDUP([@[Hour of Day]]/8,0),"A","B","C"),IF((MOD([@S2],24))<12,"WD","WN"))

我正在计算从一周开始的持续时间(以小时为单位)并将其抵消 6 以消除跨天的 C 班次重叠。然后我使用 mode 将班次拆分为工作日 8 小时轮班和周末 12 小时轮班。

匆忙完成此操作,如果您需要更详细的解释,请告诉我。

就像@eshwar 提到的,主要问题是 AND(Hour>=22,Hour<6) 永远不会是真的。将其更改为 OR(Hour<6,Hour>=22) 并且您大部分时间都在那里。但是,如果您按照下面的步骤操作,则可以将其完全删除以消除混淆。

首先,我不想重复自己,而是将星期几拉出到父 IF 中以简化逻辑。而不是根据每个可能的值检查工作日,只需检查 Weekday<=5 是否可以节省更多。

这也使得 Weekday>=6 在父 IF[value_if_false] 部分中给出,因为任何使它成为周末的东西都已经是周末了,你可以检查时间对于 "WD".

AND(Hour>=6,Hour<18)

这为 "WN" 留下了相同的原始问题,即 OR(Hour<6,Hour>=18) 而不是 AND,但由于这又是唯一剩下的选项,您也可以省略它并将 "WN" 设为 [value_if_false] 部分。

我使用缩进来显示嵌套:

=IF(WeekDay<=5,
    IF(AND(Hour_of_Day>=6,Hour_of_Day<14),"A",
       IF(AND(Hour_of_Day>=14,Hour_of_Day<22),"B","C")),
    IF(AND(Hour_of_Day>=6,Hour_of_Day<18),"WD","WN"))

产生这个:

    1   2   3   4   5   6   7
0   C   C   C   C   C   WN  WN
1   C   C   C   C   C   WN  WN
2   C   C   C   C   C   WN  WN
3   C   C   C   C   C   WN  WN
4   C   C   C   C   C   WN  WN
5   C   C   C   C   C   WN  WN
6   A   A   A   A   A   WD  WD
7   A   A   A   A   A   WD  WD
8   A   A   A   A   A   WD  WD
9   A   A   A   A   A   WD  WD
10  A   A   A   A   A   WD  WD
11  A   A   A   A   A   WD  WD
12  A   A   A   A   A   WD  WD
13  A   A   A   A   A   WD  WD
14  B   B   B   B   B   WD  WD
15  B   B   B   B   B   WD  WD
16  B   B   B   B   B   WD  WD
17  B   B   B   B   B   WD  WD
18  B   B   B   B   B   WN  WN
19  B   B   B   B   B   WN  WN
20  B   B   B   B   B   WN  WN
21  B   B   B   B   B   WN  WN
22  C   C   C   C   C   WN  WN
23  C   C   C   C   C   WN  WN

希望这种格式和简洁性使其更易于理解,减少逻辑错误的可能性。

更新:该死的放不下!

这涵盖了 Shift C 在周五晚上工作到周六而 Shift WN 在周日晚上工作到周一的情况:

=IF(WeekDay<=5,
    IF(AND(Hour_of_Day>=6,Hour_of_Day<14),"A",
       IF(AND(Hour_of_Day>=14,Hour_of_Day<22),"B",
          IF(AND(WeekDay=1,Hour_of_Day<6),"WN","C"))),
    IF(AND(Hour_of_Day>=6,Hour_of_Day<18),"WD",
       IF(AND(WeekDay=6,Hour_of_Day<6),"C","WN")))

产生这个:

    1   2   3   4   5   6   7
0   WN  C   C   C   C   C   WN
1   WN  C   C   C   C   C   WN
2   WN  C   C   C   C   C   WN
3   WN  C   C   C   C   C   WN
4   WN  C   C   C   C   C   WN
5   WN  C   C   C   C   C   WN
6   A   A   A   A   A   WD  WD
7   A   A   A   A   A   WD  WD
8   A   A   A   A   A   WD  WD
9   A   A   A   A   A   WD  WD
10  A   A   A   A   A   WD  WD
11  A   A   A   A   A   WD  WD
12  A   A   A   A   A   WD  WD
13  A   A   A   A   A   WD  WD
14  B   B   B   B   B   WD  WD
15  B   B   B   B   B   WD  WD
16  B   B   B   B   B   WD  WD
17  B   B   B   B   B   WD  WD
18  B   B   B   B   B   WN  WN
19  B   B   B   B   B   WN  WN
20  B   B   B   B   B   WN  WN
21  B   B   B   B   B   WN  WN
22  C   C   C   C   C   WN  WN
23  C   C   C   C   C   WN  WN