Golden Basim Ответов: 2

Как сделать так, чтобы не было никакого существующего сдвига, имеющего общие времена ?


что самая лучшая практика запроса в EF, чтобы проверить, если есть конфликты в начале и в конце смены ?

Что я уже пробовал:

я создал таблицу MySQL "emp_shifts"с этой колонной "
------------------------
-- id    ------- INT(11)      --
-- name  ------- VARCHAR(45)  --
-- start ------- TIMESTAMP(5) --
-- end   ------- TIMESTAMP(5) --
-- note  ------- VARCHAR(245) --



как я могу проверить новую запись перед ее вставкой , чтобы проверить, есть ли какие-либо конфликты во времени, поэтому я хочу убедиться, что каждая смена имеет уникальный период

я пишу этот запрос, но не уверен, что он будет работать нормально ..

dbEntities DB01 = ConnectionTools.OpenConn();
TimeSpan start = StartInput.TimeSpan;
TimeSpan end = EndInput.TimeSpan;
var CheckUniquePeriod_start = DB01.emp_shifts.Any(u => start >= u.start.Value.TimeOfDay && start <= u.end.Value.TimeOfDay);
if (CheckUniquePeriod_start)
{
    StartInput.ErrorText = strings.MAKE_SURE_THAT_START_TIME_DONT_CONFLICT_WITH_ANOTHER_SHIFT;
    valid = false;
}
var CheckUniquePeriod_end = DB01.emp_shifts.Any(u => end >= u.start.Value.TimeOfDay && end <= u.end.Value.TimeOfDay);
if (CheckUniquePeriod_end)
{
    StartInput.ErrorText = strings.MAKE_SURE_THAT_END_TIME_DONT_CONFLICT_WITH_ANOTHER_SHIFT;
    valid = false;
}

Mohibur Rashid

Вопрос очень неоднозначный.

Golden Basim

извините , я обновил вопрос

Richard MacCutchan

Используйте команду SELECT для поиска записей, которые имеют конфликтующие времена; независимо от того, с чем вы сравниваете.

Golden Basim

извините , я обновил вопрос

Richard MacCutchan

В чем же вопрос?

2 Ответов

Рейтинг:
2

Patrice T

Цитата:
я пишу этот запрос, но не уверен, что он будет работать нормально ..

Как программист, ваша задача также состоит в том, чтобы убедиться, что ваш код работает нормально.
Более или менее, вы должны проверить все случаи, о которых вы можете думать. Ответ таков: "код работает нормально", когда он проходит все тесты.
Для каждого теста:
- Подавайте в базу данных образцы данных.
- Проверьте, если новые данные проходят или терпят неудачу.
- Проверьте, что результат теста соответствует ожидаемому.

Вы говорите о сменах, если рабочие смены, такие как 3x8, ночная смена-это особый случай.


Рейтинг:
2

Richard Deeming

Если вы имеете дело с полным DateTime- это просто: ищите смены, которые начинаются до окончания новой смены и заканчиваются после начала новой смены.

A.StartDateTime <= B.EndDateTime && A.EndDateTime >= B.StartDateTime

Если вы смотрите только на время суток, то это зависит от того, есть ли у вас ночные смены.

Если вы этого не сделаете, и время начала смены всегда гарантированно будет раньше времени окончания смены, то вы можете использовать тот же шаблон:
A.StartTimeOfDay <= B.EndTimeOfDay && A.EndTimeOfDay >= B.StartTimeOfDay

Как только вы добавите ночные смены (например: 10 вечера – 6 утра) тогда все начинает становиться сложнее:
  • Если обе смены проходят в одночасье, то они накладываются друг на друга. (Оба включают полночь.)
  • Если ни одна смена не является ночной, то используйте тот же шаблон, что и выше:
    A.StartTimeOfDay <= B.EndTimeOfDay && A.EndTimeOfDay >= B.StartTimeOfDay

  • Если одна смена Ночная, а другая нет, то проверьте, начинается ли она раньше, чем заканчивается другая:
    A.StartTimeOfDay <= B.EndTimeOfDay || A.EndTimeOfDay >= B.StartTimeOfDay

Собрав все это вместе, вы получите что-то вроде:
(
    A.StartTimeOfDay > A.EndTimeOfDay
&&
    B.StartTimeOfDay > B.EndTimeOfDay
)
||
(
    A.StartTimeOfDay <= B.EndTimeOfDay
&&
    A.EndTimeOfDay >= B.StartTimeOfDay
)
||
(
    (
        A.StartTimeOfDay > A.EndTimeOfDay
    ||
        B.StartTimeOfDay > B.EndTimeOfDay
    )
&&
    (
        A.StartTimeOfDay <= B.EndTimeOfDay
    ||
        A.EndTimeOfDay >= B.StartTimeOfDay
    )
)