|
Вопрос про оптимизацию SQL-запроса
|
|||
---|---|---|---|
#18+
Здравствуйте! Есть такие заданные таблицы SQL Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
ID Вариант графика Время начала Время окончания0 Д 09:00:00 18:00:001 Н 18:00:00 09:00:002 С 09:00:00 09:00:003 В NULL NULL SQL Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
'31.12.9999' - это означает расписание продолжает действовать. Предполагаем, что периоды не пересекаются для каждого сотрудника. Следовательно, проверку при INSERT не ставим. ID Сотрудник График работы Дата начала Дата окончания0 Иванов ДДВ 01.01.2010 08.01.20201 Иванов НВ 09.01.2020 16.01.20202 Иванов СВ 17.01.2020 31.12.99993 Петров ДВ 01.01.2020 08.01.20204 Петров НВ 09.01.2020 16.01.20205 Петров ДВВ 17.01.2020 31.12.99996 Сидоров ДДВ 01.01.2020 08.01.20207 Сидоров ДДВ 09.01.2020 16.01.20208 Сидоров ДДВ 17.01.2020 31.12.9999 SQL Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Это результирующая таблица. Результат должен быть следующим: Сотрудник График работы Текущий график Текущая дата Дата и время начала Дата и время окончанияИванов ДДВ Д 01.01.2020 01.01.2020 09:00 01.01.2020 18:00Иванов ДДВ Д 02.01.2020 02.01.2020 09:00 02.01.2020 18:00Иванов ДДВ Д 04.01.2020 04.01.2020 09:00 04.01.2020 18:00Иванов ДДВ Д 05.01.2020 05.01.2020 09:00 05.01.2020 18:00Иванов ДДВ Д 07.01.2020 07.01.2020 09:00 07.01.2020 18:00Иванов ДДВ Д 08.01.2020 08.01.2020 09:00 08.01.2020 18:00Иванов НВ Н 09.01.2020 09.01.2020 18:00 10.01.2020 09:00Иванов НВ Н 11.01.2020 11.01.2020 18:00 12.01.2020 09:00Иванов НВ Н 13.01.2020 13.01.2020 18:00 14.01.2020 09:00Иванов НВ Н 15.01.2020 15.01.2020 18:00 16.01.2020 09:00Иванов СВ С 17.01.2020 17.01.2020 09:00 18.01.2020 09:00Иванов СВ С 19.01.2020 19.01.2020 09:00 20.01.2020 09:00.................. Д - это дневная смена, Н - ночная смена, С - суточная смена и В - выходной. Выходные дни отсекаются. Расписание, то есть график работы, цикличное: если закончилось, то начинается с начала.Написал SQL-запрос с использованием рекурсии. SQL Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86.
1. Если изменить на более раннюю дату Код: sql 1. 2. 3. 4. 5.
то пишет "Выполнение инструкции прервано. Максимальная рекурсия 100 была использована до завершения инструкции." . Можно написать так Код: sql 1.
то заработает. Но можно указать еще более раннюю дату. И не хотелось каждый раз менять ограничение. Ставить ноль небезопасно. Исходя такой логики как можно запрос было бы написать более оптимальнее для больших периодов? 2. Учитывая, что продолжающийся действующий график в таблице @ГрафикиРаботыСотрудников отмечается как '31.12.9999'. Если не ставить такое ограничение Код: sql 1. 2. 3. 4.
и оставить так Код: sql 1.
то запрос будет долгим. Скажите, как Вы оцениваете данное решение с помощью такого ограничения? Есть ли более оптимальный вариант? 3. В разных колонках присутствуют одинаковые выражения. Код: sql 1. 2. 3.
Возможно ли чтобы не повторяться эти выражения поместить как переменную для выражений, но не делать как функцию? Учитывая, что везде используются одинаковые имена полей. 4. Возможно ли было поле [Дата и время окончания] написать по короче? Именно в этой части Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Получилось как то намудрено. 5. Учитывая, что в поле [Дата и время окончания] для определения разницы между время начала и окончания смены условие сравнивает на само начало и окончание. Решение не очень удачное. Так как не учитывается, что в таблице @ГрафикиРаботы время может быть задано такое: ID Вариант графика Дата начала Дата окончания0 Д 09:00:00 00 :00:001 Н 18:00:00 23 :00:002 С 09:00:00 12 :00:00 или 08 :00:003 В NULL NULL Или в суточной смене нужно работать двое суток или более. Учитывая, что в перспективе могут быть несколько вариантов для дневной, ночной или суточной смены. Как правильнее тут написать? 6. Есть тут еще то, что не учитывается? Возможно ли бы эту задачу было бы решить без рекурсии? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 13:02 |
|
Вопрос про оптимизацию SQL-запроса
|
|||
---|---|---|---|
#18+
Нахера тут "рекурсия"? Шобы було? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 13:09 |
|
Вопрос про оптимизацию SQL-запроса
|
|||
---|---|---|---|
#18+
ferzmikk, а как Вы выбираете из ДДВ, когда у сотрудника Д, а когда В? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 14:23 |
|
Вопрос про оптимизацию SQL-запроса
|
|||
---|---|---|---|
#18+
ferzmikk Код: sql 1. 2. 3. 4. 5. 6.
ID Сотрудник График работы Дата начала Дата окончания0 Иванов ДДВ 01.01.20 2 0 08.01.20201 Иванов НВ 09.01.2020 16.01.2020............... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 15:03 |
|
Вопрос про оптимизацию SQL-запроса
|
|||
---|---|---|---|
#18+
Владислав Колосов ferzmikk, а как Вы выбираете из ДДВ, когда у сотрудника Д, а когда В? 01.01.2020 - "Д" 02.01.2020 - "Д" 03.01.2020 - "В" 04.01.2020 - "Д" 05.01.2020 - "Д" 06.01.2020 - "В" 07.01.2020 - "Д" 08.01.2020 - "Д" Потом в таблице @ГрафикиРаботыСотрудников берем вторую строку. График работы "НВ". Дата начала и окончания такого расписания соответственно: 09.01.2020 и 16.01.2020. Продолжаем 09.01.2020 - "Н" 10.01.2020 - "В" 11.01.2020 - "Н" 12.01.2020 - "В" 13.01.2020 - "Н" 14.01.2020 - "В" 15.01.2020 - "Н" 16.01.2020 - "В" Дальше аналогично ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 15:07 |
|
Вопрос про оптимизацию SQL-запроса
|
|||
---|---|---|---|
#18+
ferzmikk, правильно ли я понял, что в первом сообщении таблица результата заполнена неверно? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 15:48 |
|
Вопрос про оптимизацию SQL-запроса
|
|||
---|---|---|---|
#18+
Владислав Колосов ferzmikk, правильно ли я понял, что в первом сообщении таблица результата заполнена неверно? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 15:54 |
|
Вопрос про оптимизацию SQL-запроса
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 16:29 |
|
Вопрос про оптимизацию SQL-запроса
|
|||
---|---|---|---|
#18+
ferzmikk, решение с дополнительной таблицей - справочником графиков. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38.
можно сделать свою таблицу чисел или расширить её в запросе с помощью приёма в сообщении выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 17:53 |
|
Вопрос про оптимизацию SQL-запроса
|
|||
---|---|---|---|
#18+
ferzmikk Есть своя система учёта отработанного времени на SQL. Разработка с "нуля", в эксплуатации более 15 лет. На выходе: табель рабочего времени, данные для расчёта заработной платы, расчета отпусков и больничных. Выгрузка стажа в пенсионный фонд и различные отчёты и аналитика . Судя по всему у вас самое начало. Пытаюсь понять вашу задачу, проектируете с "нуля" или адаптируете готовую систему? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 20:48 |
|
Вопрос про оптимизацию SQL-запроса
|
|||
---|---|---|---|
#18+
invm, Владислав Колосов, Спасибо, по экспериментирую! ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 07:13 |
|
Вопрос про оптимизацию SQL-запроса
|
|||
---|---|---|---|
#18+
Alex_Toms Есть своя система учёта отработанного времени на SQL . Разработка с "нуля", в эксплуатации более 15 лет. На выходе: табель рабочего времени, данные для расчёта заработной платы, расчета отпусков и больничных. Выгрузка стажа в пенсионный фонд и различные отчёты и аналитика . Судя по всему у вас самое начало. Пытаюсь понять вашу задачу, проектируете с "нуля" или адаптируете готовую систему?Я не хочу изобретать велосипед. Во-первых, хочу SQL овладеть в совершенстве. Во-вторых, научиться проектировать небольшие системы. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 08:16 |
|
|
start [/forum/topic.php?fid=46&fpage=29&tid=1684898]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
87ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 27ms |
total: | 226ms |
0 / 0 |