Создать массив дат / времени между заданными часами - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь создать горизонтальную, возрастающую ARRAY дату / время, но только с учетом указанного времени (8:00 утра - 5:00 вечера). Я пытался использовать NETWORKDAYS.INTL, но это казалось более трудным и неизбежным, не давало точных результатов так, как я это делал (вероятно, неправильно).

February 1, 2020 8:00AM
February 1, 2020 9:00AM
[all hours in between]
February 1, 2020 4:00PM
February 1, 2020 5:00PM

February 2, 2020 8:00AM
[...]
February 2, 2020 5:00PM

February 3, 2020 8:00AM

Я могу сделать формула для первого дня, но я спотыкаюсь при добавлении следующих дней.

Вот что у меня есть на данный момент:

=IF(
  AND(J2>=$E1+$B1,J2<$E1+$C1),
  J2+(1/24),
  J2-$C1+$B1
)

J2 = Первая дата в массиве =EOMONTH(TODAY(),-1)+1+[8:00AM]

E1 = Первый день месяца =EOMONTH(TODAY(),-1)+1

B1 = Время начала 8:00AM

C1 = Время окончания 5:00PM

Вот мой лист . Моя формула находится в K2 (в настоящее время перетаскивая формулу по строке, но единственная формула была бы идеальной.)

РЕДАКТИРОВАТЬ: После игры с ним и обнаружения ROUNDDOWN, чтобы извлечь дату, я придумал это :

=IF(
  AND(J2>=ROUNDDOWN(J2,0)+$B1,J2<ROUNDDOWN(J2,0)+$C1),
  J2+(1/24),
  ROUNDDOWN(J2,0)+1+$B1
)

Ответы [ 5 ]

1 голос
/ 06 февраля 2020

короче, быстрее, легкое математическое решение:

=ARRAYFORMULA(SPLIT(QUERY(TRANSPOSE(QUERY(TRANSPOSE(ARRAY_CONSTRAIN(
 N(E1)+SEQUENCE(DAYS(EOMONTH(E1, D1-1), E1), 24, HOUR(B1))/24,9^9, 
 1+HOUR(C1)-HOUR(B1))),,9^9)),,9^9), " "))

0

1 голос
/ 06 февраля 2020

Я думаю, что это будет работать, основываясь на некоторых других наших обсуждениях. это автоматически сгенерированный массив, который покажет только дату за последние 2 недели. затем дата и время предстоящих двух недель, а затем просто дата на две недели после этого. Вы увидите число 42 в части SEQUENCE формулы. это контролирует общее количество дней, в течение которых работает формула. Вы также увидите СЕГОДНЯ () - 14. Это когда массив установлен на «начало».

=ARRAYFORMULA(TRANSPOSE(TODAY()-14+QUERY(SEQUENCE(42*24,1,0)/24,"where (Col1 % 1=0 and Col1<14) or (Col1 % 1=0 and Col1>=28) or (Col1 % 1<="&N(C1+0.000001)&" and Col1 % 1>="&N(B1)&" and Col1>=14 and Col1<29)",0)))
1 голос
/ 06 февраля 2020

попробуйте:

=ARRAYFORMULA(E1-1+
 SPLIT(QUERY(TRANSPOSE(REPT(TRANSPOSE(ROW(INDIRECT("A1:A"&
 DAYS(EOMONTH(E1, 3), E1))))&" ", 
 HOUR(C1)-HOUR(B1)+1)),,9^9), " ")+
 SPLIT(REPT(QUERY((ROW(INDIRECT("A1:A"&
 HOUR(C1)-HOUR(B1)+1))+HOUR(B1)-1)/24&" ",,9^9), 
 DAYS(EOMONTH(E1, 3), E1)), " "))

, чтобы изменить интервал с 3 месяцев на один, заменить эти два 3 на два 1

0

0 голосов
/ 06 февраля 2020

@ MattKing решение:

=ARRAYFORMULA(TRANSPOSE(EOMONTH(TODAY(),-1)+1+QUERY(MOD(
 SEQUENCE(SUM({-1,1}*EOMONTH(TODAY(),{-1,D1}))*24,1,0)/24,{9^99,1}),
 "select Col1 where Col2<="&N(C1+0.000001)&" and Col2>="&N(B1),0)))

0

0 голосов
/ 06 февраля 2020

Хотя это действительно решает мою общую проблему, я не ищу окончательную формулу, которая была бы единственной ARRAYFORMULA.

=IF(
  AND(J2>=ROUNDDOWN(J2,0)+$B1,J2<ROUNDDOWN(J2,0)+$C1),
  J2+(1/24),
  ROUNDDOWN(J2,0)+1+$B1
)
...