根据时间和特定日期分配一个值(2 个不同的变量)
Assign a value based on time and specific day (2 different variables)
我正在尝试根据 sheet 中记录的时间和日期将特定的工作班次字母分配给新列。
我创建了 2 个新字段以使计算更容易。
- 使用我的 "date" 列 ("m/dd/yyyy"),我创建了一个名为 "WeekDay" 的列,它基本上显示每条记录的日期,数字从 1 到 7
(1 = 星期一 5 = 星期五,依此类推)。
- 使用我的 "time" 列 ("hh:mm AM/PM"),我创建了一个名为 "Hour of Day" 的列,它根据时间显示从 0 到 24 的数字
我的记录(即:5:40 AM = 5)
我要使用的班次字母如下:
- 轮班 - 周一到周五 6 点到 14 点。
- B 班 - 周一到周五 14 点到 22 点。
- C 班 - 周一至周五 22 点到 6 点。
- WD(周末日)班次 - 周六和周日从 6 点到 18 点。
- WN(周末晚上)轮班 - 周六和周日从 18 点到 6 点。
以下是我所做的,代码有效,但仅适用于班次 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
我正在尝试根据 sheet 中记录的时间和日期将特定的工作班次字母分配给新列。
我创建了 2 个新字段以使计算更容易。
- 使用我的 "date" 列 ("m/dd/yyyy"),我创建了一个名为 "WeekDay" 的列,它基本上显示每条记录的日期,数字从 1 到 7 (1 = 星期一 5 = 星期五,依此类推)。
- 使用我的 "time" 列 ("hh:mm AM/PM"),我创建了一个名为 "Hour of Day" 的列,它根据时间显示从 0 到 24 的数字 我的记录(即:5:40 AM = 5)
我要使用的班次字母如下:
- 轮班 - 周一到周五 6 点到 14 点。
- B 班 - 周一到周五 14 点到 22 点。
- C 班 - 周一至周五 22 点到 6 点。
- WD(周末日)班次 - 周六和周日从 6 点到 18 点。
- WN(周末晚上)轮班 - 周六和周日从 18 点到 6 点。
以下是我所做的,代码有效,但仅适用于班次 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