|
Увеличение времени на разные промежутки
|
|||
---|---|---|---|
#18+
Здравствуйте. Есть дата от которой нужно сделать несколько промежутков и количество дней. В общем должно получиться два периода (начало, конец). Код: sql 1. 2. 3. 4. 5.
Я понимаю что нужно создать таблицу и к дате добавлять Код: sql 1.
но вот как сделать добавление еще двух дат с учетом количества дней не знаю... Буду благодарен за помощь ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 09:20 |
|
Увеличение времени на разные промежутки
|
|||
---|---|---|---|
#18+
Ну например так... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=7a052b7d2076555c4284ecf45acdbd24 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 09:28 |
|
Увеличение времени на разные промежутки
|
|||
---|---|---|---|
#18+
Akina, Да именно то что нужно спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 09:56 |
|
Увеличение времени на разные промежутки
|
|||
---|---|---|---|
#18+
Akina, все же я не до конца проверил... При выборе нескольких дней (с 20 по 25) данные не те что должны быть... Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 12:30 |
|
Увеличение времени на разные промежутки
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 12:45 |
|
Увеличение времени на разные промежутки
|
|||
---|---|---|---|
#18+
Без рекурсии: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 13:18 |
|
Увеличение времени на разные промежутки
|
|||
---|---|---|---|
#18+
Лучше задавать начало периода и его длительность, тогда результат будет более предсказуемым. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 13:26 |
|
Увеличение времени на разные промежутки
|
|||
---|---|---|---|
#18+
Спасибо за ответы. Помогло. Но вот как быть когда нужно более мельче раздробить промежуток? Я так понимаю универсального решения нету Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 13:33 |
|
Увеличение времени на разные промежутки
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 13:44 |
|
Увеличение времени на разные промежутки
|
|||
---|---|---|---|
#18+
Соединив мое предыдущее решение с решением по ссылке получим: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Как видим, ничего сложного здесь нет. Можно дробить интервалы до минут. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 14:27 |
|
Увеличение времени на разные промежутки
|
|||
---|---|---|---|
#18+
В частной беседе был задан вопрос: "Нельзя ли обойтись без явного задания длительности смены, ведь известно же начало следующей смены?". Отвечу здесь, так как это продолжение моего предыдущего сообщения. Можно, для этого нужно найти разность времени начал следующей и текущей смены. Есть только трудность в нахождении длительности последней смены, так как нельзя задать время '24:00'. Под сменой понимается интервал времени в течение одних суток. Для упрощения рассмотрения точку времени, разделяющую смены, отнесем к обеим сменам. У нас есть календарь и таблица начала смен. Пусть у нас будут 4 смены. Смены могут быть разной длительности и не обязательно должны начинаться в полночь. Найдем начало и конец каждой смены, а также длительность смен. Представим время начала смен как дату со временем. Конкретная дата не имеет значение, поэтому пусть это будет дата по умолчанию. Далее найдем начало первой смены следующего дня. Это происходит в запросе С. Теперь можно найти длительность всех смен (запрос D). Функция first_value взята для наглядности. В этом месте можно взять минимальное значение B.b. Тогда запросы C и D можно объединить в один запрос, но получим громоздкое выражение для Т. Код: 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.
Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2022, 23:09 |
|
Увеличение времени на разные промежутки
|
|||
---|---|---|---|
#18+
Сегодня задали следующий вопрос: "Как быть, если первая смена начинается в 8:00, а все последующие смены, если даже они заканчиваются или начинаются после смены даты, все равно относятся к дате начала первой смены?". Эта задача чуть сложнее предыдущей. Придется покрутить стрелку часов. Сначала против часовой стрелки так, чтобы начало 1-й смены совпало с началом суток. Вычислить длительность смен. После этого вернуть назад стрелку часов и завершить вычисления. Все вычисления я разбил для наглядности на простые шаги. Календарь остался тот же, только явно задан тип данных, чтобы в запросе было меньше преобразований типов. В таблицу смен добавился столбик с номером смены, а время начала смены получило тип. При конвертации времени к дате, она получает по умолчанию дату 1900-01-01. Осталось найти начало и конец каждой смены, а также длительность смен. Да, термин смена не обязательно относится к производственной смене. Это просто интервал времени. Код: 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.
Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2022, 17:44 |
|
|
start [/forum/topic.php?fid=46&fpage=4&tid=1683880]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 238ms |
total: | 395ms |
0 / 0 |