|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
Нужна помощь. Задача следующая... С помощью простых операций написать SQL выражение для вычисления числа рабочих дней между двумя датами(субботы и воскресения не считать). d1 date; d2 date; Использовать функции. TRUNC( d2 - d1 ) - число дней между датами TRUNC( d1, 'D' ) - окруление на начало недели TRUNC( d1, 'MM' ) - окруление на начало месяца LEAST ( a, b ) - наименьшее значение GREATEST ( a, b ) - наибольшее значение ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2004, 14:09 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
так пойдет? select sum(case when to_char(trunc(sysdate)-rownum,'d') in (1,7) then 0 else 1 end) from all_objects where rownum<=trunc(sysdate)-trunc(sysdate-15) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2004, 14:25 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
Например, Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2004, 14:27 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
Обсуждалось и не раз. STFW , в то числе у Кайта. Приведенные запросы не учитывают праздничные дни. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2004, 14:42 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
select count(*) from (select to_date('01.01.2004','dd.mm.yyyy')+rownum dat, to_char(to_date('01.01.2004','dd.mm.yyyy')+rownum,'DY') dy from sys.all_objects) where dat<=to_date('01.01.2005','dd.mm.yyyy') and dy not in('SAT','SUN') ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2004, 14:49 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
Leonid_BОбсуждалось и не раз. STFW , в то числе у Кайта. Приведенные запросы не учитывают праздничные дни. Само собой не учитываются праздники, а так же переносы, которые установлены законодательством на текущий год, но если это учитывать, то надо еще написать интерфейс для ведения праздников и переносов, купить лицензию на консультант или гарант, в общем это уже не "простое SQL предложение" суть как я понял, просто посчитать количество понедельников- пятницев в период между датами. единственно смущает ограничение по операторам, может это лаба, и нужно обойтись перечисленным набором операторов.... а на счет праздников - в связи с переносом рабочим может назначиться суббота или воскресенье, а в постановке четко сказано не считать сбт и вск, следовательно к праздникам привязки нет :) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2004, 15:06 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
Спасибо. Да, верно, надо подсчитать только количествово дней с понедельника по пятницу. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2004, 16:32 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
_Nikotin_Например, Код: plaintext 1. 2. 3. 4.
Та же задача, понравился/работает вариант, но... На для юзеров выдает invalid table. Как его перипесать не используя системную таблицу(вью)? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2004, 17:12 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
Факир, замени dba_objects на любой набор данных, имеющий достаточное количество строк. В первом приближении - на all_objects. См. также select натуральный ряд ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2004, 17:52 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
Well, you can either use function TRUNC and some driver table (data_dictionary or "select натуральный ряд", or whatever else you have) and both readability and performance wise it would be best solution. Or you can function NEXT_DAY, some math and table dual: NEXT_DAY(start_date - 1,'SUNDAY') is first sunday >= start_date. NEXT_DAY(end_date - 7,'SUNDAY') is last Sunday <= end_date. Therefore: (NEXT_DAY(end_date - 7,'SUNDAY') - NEXT_DAY(start_date - 1,'SUNDAY')) / 7 + 1 is number of Sunday's between start_date and end_date. Same way: (NEXT_DAY(end_date - 7,'SATURDAY') - NEXT_DAY(start_date - 1,'SATURDAY')) / 7 + 1 As a result, number of weekdays between start_date and end_date is: end_date - start_date + 1 -((NEXT_DAY(end_date - 7,'SUNDAY') - NEXT_DAY(start_date - 1,'SUNDAY')) / 7 + 1 + (NEXT_DAY(end_date - 7,'SATURDAY') - NEXT_DAY(start_date - 1,'SATURDAY')) / 7 + 1) or end_date - start_date - 1 -(NEXT_DAY(end_date - 7,'SUNDAY') - NEXT_DAY(start_date - 1,'SUNDAY')) / 7 - (NEXT_DAY(end_date - 7,'SATURDAY') - NEXT_DAY(start_date - 1,'SATURDAY')) / 7 or: SELECT end_date - start_date - 1 -(NEXT_DAY(end_date - 7,'SUNDAY') - NEXT_DAY(start_date - 1,'SUNDAY')) / 7 - (NEXT_DAY(end_date - 7,'SATURDAY') - NEXT_DAY(start_date - 1,'SATURDAY')) / 7 FROM DUAL; SY. P.S. The above assumes число рабочих дней между двумя датами includes both start and end dates. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2004, 18:23 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
Эс Вай мой кумир! ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2004, 13:37 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
Эй, если кому вдруг понадобится, нате: Код: 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.
Это до меня на собеседовании ... надо им, ..., сделать выражение. Надеюсь это поможет кому. Заодно, может, ошибки найдёте... А это то, что все предлагают: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2021, 09:13 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
dmitryk1, cубота выходной? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
ps 1,7 зависит от нлс ..... stax ...... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2021, 09:43 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
Stax dmitryk1, cубота выходной? ps 1,7 зависит от нлс Это да. Забыл уточнить. Но основное было в первом куске кода. Второй - это так, собрать способы в кучу. Так вот, к верхней формуле есть замечания? (надеюсь я не ошибся) На всякий - вот, в голом виде(то же что сверху): Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2021, 10:19 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
dmitryk1, у многих Код: plsql 1. 2. 3. 4. 5. 6.
.... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2021, 13:52 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
dmitryk1, Эта задача не имеет практического универсального решения средствами SQL. Может этого понимания от Вас и хотели на собеседовании? Поясню. В разных странах разные выходные дни, соответственно, при принятии задачи в разработку, необходимо хотя-бы поинтересоваться, о какой стране идёт речь? Для практического решения этой задачи есть такой путь: 1. Создать таблицу КАЛЕНДАРЬ, автоматически заполняемую по событию,например, запросу начальника отдела кадров. 2. Должна быть таблица СТРАНЫ 3. Должна быть таблица отношений M-to-M КАЛЕНДАРЬ_СТРАНЫ, где и прописываются выходные и праздничные, прописываются автоматически, с ручной корректировкой на всякие Указы, постановления и т.п. Это самый минимум. После этого, Ваша задача надёжно и на все времена решается одним совсем небольшим SQL-запросом, который можно со спокойной совестью задвинуть в дальний чулан. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2021, 18:20 |
|
Вычисление числа рабочих дней между двумя датами
|
|||
---|---|---|---|
#18+
zeon11, В принципе, если нужно массово высчитывать количество рабочих дней за случайные периоды, задачи кадрового учёта, то лучше делать это не вычислением списка, хоть это и проще, а одним выражением. Просто это быстрее. Хотя величину выигрыша стоило бы и протестировать. По отношению к выходным в странах - на самом деле вариантов не так много. А про праздники тут речь не идёт и обрабатывать их получится только наполнением таблицы. А вообще я согласен - задача по большей части бессмысленная и задаётся исключительно чтобы "проверить качество претендента". Потому и сюда выложил, вдруг кому-то зададут такую задачу. Чтобы люди не тратили время на бессмысленную ерунду. zeon11Может этого понимания от Вас и хотели на собеседовании? Кстати, про страну речи не было - всё однозначно, а вот мысли о том, чтобы сказать про невозможность, мне в голову не пришла, потому, что воспринималось мною как абстрактная математическая задачка. Так я её и решил. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2021, 06:08 |
|
|
start [/forum/topic.php?fid=52&fpage=25&tid=1880410]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 131ms |
0 / 0 |