Алгоритм определения ежемесячных дат каждые полмесяца и две недели - PullRequest
0 голосов
/ 16 июня 2020

Использование PostgreSQL (11+), Ruby (2.6+) и Rails (5.2 +)

У меня есть ряд дат, представляющих даты выплаты заработной платы, например

2000-06-30
2000-06-15
2000-05-30
2000-05-15
2000-04-28
2000-04-14
2000-02-15
2000-01-28
2000-01-14

Предостережения:

  • Ряд может быть неполным, с пропусками, охватывающими одну или несколько расчетных дат.

  • Организация-работодатель устанавливает свой собственный график, так, например, полумесяц может быть 15-м и 30-м или 1-м и 16-м или другой комбинацией.

  • Последняя дата (или, возможно, две) может быть "неправильной", поскольку не синхронизируется c с предыдущими платежными ведомостями, если окончательная зарплата сотрудника была сокращена из-за неправильной платежной ведомости.

  • Сотрудник мог получать платежи из нескольких разных плановых ведомостей в течение ряда, возможно перекрытие.

Какой алгоритм или подход я могу применить для определения с достаточной уверенностью частоты начисления заработной платы, применимой на конец серии?

Изменить:

Предполагаемый результат - один o f эти четыре символа:

  • : ежемесячно
  • : каждые полгода
  • : каждые две недели
  • : еженедельно

( Частоты начисления заработной платы, отличные от этих четырех, могут быть проигнорированы в этой конкретной c ситуации, но могут быть полезны при разработке универсального решения.)

1 Ответ

2 голосов
/ 17 июня 2020

Go через массив и вычислите разницу между текущим и следующим элементом в списке (например, 2000-06-30 - 2000-06-15 = 15), пока не получите список «количество дней между платежными ведомостями. ”(Например, [15, 15, 15, 17 ...])

Затем используйте режим этого списка, чтобы найти наиболее распространенное расстояние между платежными ведомостями (в приведенном выше примере режим равен 15). У вас возникнет соблазн найти среднее / среднее, но режим лучше подходит для игнорирования этих «неправильных» дат.

Кричите, если вам нужна помощь в реализации любого из этих шагов в ruby, но вы должны найти SO ответы уже есть, чтобы вы начали.

Наконец, создайте «тестовый» список дат - тот, где вы вручную знаете ответ, который хотите. Играйте с этим, пока ваш алгоритм не даст вам ответ.

...