|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
Добрый день, хочу попросить Вашей помощи в таком вопросе: Существует таблица отпусков: Дата начала отпуска, дата конца, таб. номер сотрудника. Промежуточная таблица: таб. номер, год(к примеру 2011,2012,2013). Нужно получить кол-во дней нахождения на больничном и периоды в каждом из годов промежуточной таблицы, причем если сотрудник был на больничном с 01.11.2011 по 02.01.2012 то в результате должно быть так: 2011г 01.11.11 - 31.12.11 | 61день 2012г. 01.01.2012 - 02.01.2012 | 2 дня. пробовал делать через case, где @DMin= 01.01.2011, @DMax=01.01.2013, nYear=2011,2012,2013 Код: sql 1. 2. 3. 4. 5.
но это отрабатывает только если год начала отпуска не входит в nYear. Как лучше поступить? Заранее спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2013, 10:05 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
rukesa, зачем новую тему? в старой бы написали. напишите скрипт создания таблиц, ввода тестовых данных (здесь же, еще тему создавать не надо) и приведите свой ПОЛНЫЙ запрос, а не отрывок ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2013, 10:11 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
Рекомендации по оформлению сообщений в форуме Не написали скрипт тестовых данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2013, 10:17 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
rukesa, Чего-то на зал за здравие отпуска, кончил за упокой больничные ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2013, 10:24 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
Добрый Э - Эхrukesa, Чего-то на зал начал за здравие отпуска, кончил за упокой больничные ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2013, 10:25 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
Да, ладно, забей. Человек совершает тысячи ошибок в день. Хуже, когда настолько слеп, что не замечаешь их. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
И запомните - время непрерывно . 31.12.11 - выводите так в интерфейсе, но внутрях должны фиксироваться моменты времени (2012-01-01 00:00:00.0000000) и не важно, с какой точностью тип хранения. И не важно "реальность" - главное модель. И не думайте что вы заметили все те 42 принципа, которые использовались в написании запроса. Главное постепенно их впитывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2013, 10:49 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
Согласен, так организовать таблицы (вычисляемые колонки) удобнее: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2013, 10:54 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
не совсем понял 2 последних сообщения и как это относится к моему вопросу... перепутал больничные и отпуска, так мне нужно будет и то и то, без разницы на чем пробовать. исходные таблицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Соответственно я спрашиваю, что будет вместо "?", чтобы получить за 3 года(2011,2012,2013) периоды, в которые сотрудник болел. Т.е. 2011 | 20111204 | 20111231 | 27 2011 | 20110901 | 20111231 | 122 2012 | 20120101 | 20120301 | 61 2012 | 20120101 | 20121231 | 365 2012 | 20121101 | 20121201 | 30 2012 | 20130101 | 20130201 | 30 Надеюсь теперь стало понятнее....спасибо ответившим и поправляющим ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2013, 13:13 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
блин опять ошибся, после Код: sql 1.
должны идти Код: sql 1.
сорри ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2013, 13:15 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
Никаких предложений/мыслей нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2013, 15:10 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
rukesa, есть. Поищи по форуму "пересечение интервалов". Лень майкросовтовский синтаксис вспоминать просто. Не найдешь - попытаюсь вспомнить. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2013, 15:11 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
спасибо, нашел много. только вот пока никак не могу связать их со своей задачей... похоже Mnior что-то похожее мне написал, спасибо, но что-то с синтаксисом разобраться не получается, да и опять же к своей задаче привязать не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2013, 16:21 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
rukesa, для вашего последнего примера соединять таблицы надо так, например Код: sql 1.
, получатся пересечения для каждого года. и уже для результата искать границы интервалов, обрезая выходящее за границы года tr.nYear ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2013, 16:27 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
rukesa, а почему у вас данные insert #Ill values('20111204','20120301','123') insert #Ill values('20110901','20130201','123') insert #Ill values('20121101','20121201','123') имеют не пустое пересечение? что больной одновременно два раза болел? хотел запилить через window функции, но вот этот момэнт всю малину портит ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2013, 20:23 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
Извиняюсь, писал этот запрос прямо здесь, поэтому даты брал из головы. Действительно, даты не должны пересекаться. Если нужно, могу придумать новые даты. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2013, 08:32 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
Shakill, спасибо, учту ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2013, 08:33 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
efqwefqwerukesa, а почему у вас данные insert #Ill values('20111204','20120301','123') insert #Ill values('20110901','20130201','123') insert #Ill values('20121101','20121201','123') имеют не пустое пересечение? что больной одновременно два раза болел? хотел запилить через window функции, но вот этот момэнт всю малину портитКто мешает "однотипные" интервалы, имеющие пересечения, "склеить" в единый интервал, после чего "пилить" уже оконными функциями? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2013, 08:37 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
rukesa, очень часто интервальные задачи решаются через преобразование интервалов в точки, после чего решается, как из полученного множества точек вновь собрать интервалы. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2013, 08:43 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
Добрый Э - Эх, В целом, по сотруднику пересечение разнотиповых интервалов допускается? К примеру, человек пошел в отпуск и в середине отпуска заболел. Ну или наоборот: заболел, а в середине болезни случился очередной отпуск. Или такое в принципе невозможно и в каждый момент времени у сотрудника может быть ровно одно состояние: работает, отпуск, на больничном, в командировке и т.д.? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2013, 08:54 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
Пересечение не допускается, в примере я ошибся, когда писал интервалы. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2013, 09:24 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
Shakillrukesa, для вашего последнего примера соединять таблицы надо так, например Код: sql 1. 2. 3. 4.
, получатся пересечения для каждого года. и уже для результата искать границы интервалов, обрезая выходящее за границы года tr.nYearДля непрерывных интервалов не может быть оба знака с равенством. Всегда с одной стороны отрезка одна точка выколота. А если добавятся время. Вы будете писать 23:59:59:997 ? Вы всё равно упустите кусок времени в зависимости от точности. ---------------- Ну вот с подсчётом дней. Можно было самому дописать: Код: 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.
Не нравится пример через WITH? Вот через таблы Код: 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.
Зачем нужна таблица (год, сотрудник)? Хватает просто список годов, для разделения. И что тут ещё мусолить? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2013, 12:21 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
Добрый Э - Эх, Огромное спасибо! Это-то я и пытался все получить, пробовал и курсором и через case, да все никак. также большое спасибо всем ответившим! ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2013, 12:23 |
|
Вопрос по выборке
|
|||
---|---|---|---|
#18+
MniorShakillrukesa, для вашего последнего примера соединять таблицы надо так, например Код: sql 1. 2. 3. 4.
, получатся пересечения для каждого года. и уже для результата искать границы интервалов, обрезая выходящее за границы года tr.nYearДля непрерывных интервалов не может быть оба знака с равенством. Всегда с одной стороны отрезка одна точка выколота. А если добавятся время. Вы будете писать 23:59:59:997 ? Вы всё равно упустите кусок времени в зависимости от точности. а зачем усложнять задачу? если в опорной таблице только номера годов, то для проверки попадания в заданный год подходят нестрогие сравнения (и неважно, есть в таблице больничных время или нет) и это самый простой вариант. можно, конечно, поступить другим образом - преобразовать номер года в начало года (включаем) и начало следующего года (его не включаем), но это общий подход и код бы получился несколько сложнее, смысла тут нет ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2013, 12:55 |
|
|
start [/forum/topic.php?fid=46&msg=38343546&tid=1705947]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
157ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 250ms |
total: | 510ms |
0 / 0 |