|
Запрос, возвращающий количество дней в месяце без учёта выходных | ☑ | ||
---|---|---|---|---|
0
Sibi-2
19.10.13
✎
12:52
|
Написать запрос, который по входному параметру «Месяц» типа «Дата», возвращает количество дней в месяце без выходных (субботы, воскресенья).
Например, параметр Месяц = «1 мая 2013», результат запроса: 23. |
|||
1
Maxus43
19.10.13
✎
12:54
|
производственный календарь есть в конфе? тогда проблем нет
|
|||
2
Генерал
19.10.13
✎
12:55
|
свяжи с производственным календарем и извлекай
|
|||
3
Sibi-2
19.10.13
✎
12:55
|
Нет, это задача исключительно для решения при помощи запросов :) Никакой конфы у нас условно нет
|
|||
4
Grobik
19.10.13
✎
12:57
|
Если за определенный год, например 2009-2014 то без проблем. А в общем случае никак.
|
|||
5
Maxus43
19.10.13
✎
12:57
|
(3) в общем случае это невозможно, по той простой причине что каждый Год правительство РФ сама тасует праздники, переносит их на другие дни и выпускает утверждённый календарь
|
|||
6
Sibi-2
19.10.13
✎
12:58
|
Выкидываем только субботу и воскресение
|
|||
7
GROOVY
19.10.13
✎
12:59
|
Хорошая, но тупая, для проверки знаний сотрудника, задача. Взял в копилку...
|
|||
8
Grobik
19.10.13
✎
13:00
|
(6) Тогда вообще смехотворно.
|
|||
9
Maxus43
19.10.13
✎
13:02
|
(7) я вот сходу запрос не напишу такой, надо строрить таблицу дат и т.д. - нафиг
|
|||
10
GenV
19.10.13
✎
13:04
|
(9) Разность дат в днях, зная день недели первой даты?
|
|||
11
Sibi-2
19.10.13
✎
13:06
|
Разность дат - да, но тоже не слишком тривиально. Есть вот такой вариант, но ошибаемся на 1 день: ВЫБРАТЬ
ДЕНЬГОДА(КОНЕЦПЕРИОДА(&ДатаЗ, МЕСЯЦ)) - ДЕНЬГОДА(НАЧАЛОПЕРИОДА(&ДатаЗ, МЕСЯЦ))- (НЕДЕЛЯ(КОНЕЦПЕРИОДА(&ДатаЗ, МЕСЯЦ)) - НЕДЕЛЯ(НАЧАЛОПЕРИОДА(&ДатаЗ, МЕСЯЦ)))*2 КАК Поле1 |
|||
12
GROOVY
19.10.13
✎
13:06
|
(10) Угу.
|
|||
13
Maxus43
19.10.13
✎
13:11
|
(10) а кто сказал что ты её знаешь?
|
|||
14
GROOVY
19.10.13
✎
13:14
|
(13) Там же месяц как дата передается.
|
|||
15
GenV
19.10.13
✎
13:19
|
(13) Параметр дата, затем ДЕНЬНЕДЕЛИ(&НачалоПериода)
|
|||
16
Maxus43
19.10.13
✎
13:20
|
а, я думал без даты надо построить таблицу годов, учитывая високосные и т.д.)
|
|||
17
Sibi-2
19.10.13
✎
15:19
|
Это всё? :)
|
|||
18
Rovan
гуру
19.10.13
✎
16:07
|
(17) начинай сам писать запрос с учетом (15)
покажи что получилось если не буде работать еще что-то посоветуем |
|||
19
Kaushly
19.10.13
✎
16:56
|
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 0) КАК ДатаМесяца ПОМЕСТИТЬ ДниМесяца ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 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) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ КОЛИЧЕСТВО(ДниМесяца.ДатаМесяца) КАК ДатаМесяца ИЗ ДниМесяца КАК ДниМесяца ГДЕ НАЧАЛОПЕРИОДА(ДниМесяца.ДатаМесяца, МЕСЯЦ) = НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ) И ДЕНЬНЕДЕЛИ(ДниМесяца.ДатаМесяца) <= 5 |
|||
20
GenV
19.10.13
✎
19:21
|
(19) Можно это все сделать в одном выражении
|
|||
21
МихаилМ
20.10.13
✎
11:51
|
хорошая задача на проверку профпригодности.
|
|||
22
mrDSide
20.10.13
✎
12:59
|
Високосный год?
В мае (условно) 2012 и 2013 разное кол-во рабочих дней (условно). ДОБАВЬТЕ ПРОИЗВОДСТВЕННЫЙ КАЛЕНДАРЬ И НЕ ЗАНИМАЙТЕСЬ ЕРУНДОЙ. |
|||
23
hhhh
20.10.13
✎
13:01
|
(22) в (19) всё это учтено
|
|||
24
GenV
20.10.13
✎
17:33
|
(22) Вообще то, производственный календарь для данной задачи совсем не нужен ...
|
|||
25
Мимохожий Однако
20.10.13
✎
19:49
|
Достаточно анализировать первые четыре дня, т.к. для 28 дней всегда будет 20 рабочих дней.
|
|||
26
mrDSide
20.10.13
✎
21:10
|
(25) а четыре для откуда Вы предлагаете анализировать? (10) с (24) - откуда Вы предлагаете брать день недели?
Представляю себе бухгалтера: -введите первый день недели... -введите количество "красных" дней календаря без учета обычных выходных... -введите количество перенесенных рабочих дней (предпраздничный на пятницу следующей недели, а следующая неделя - это уже новый месяц; или такое бывает только у нас в РБ?). Делайте нормальный производственный календарь, тем более что загрузить можно с гос. сайта какого-нибудь. Пишите процедуры заполнения. ВСЕ РАВНО К ЭТОМУ ПРИДЕТЕ. |
|||
27
GenV
20.10.13
✎
22:00
|
(26) Читай условие задачи в (6) ...
|
|||
28
mrDSide
20.10.13
✎
22:59
|
(27) красные дни календаря и переносы как не крути учитывать надо. Думай головой.
|
|||
29
GenV
20.10.13
✎
23:05
|
(28) Про красные дни уже уточнили в самом начале - их не надо учитывать! Советую почитать начало обсуждения...
|
|||
30
Aprobator
20.10.13
✎
23:14
|
первое, что приходит в голову - отдать в запрос ТЗ с датами месяца. А там - дело техники.
|
|||
31
mrDSide
20.10.13
✎
23:41
|
(29) Любезный там ясно написано - "без выходных", а то что дальше "(суббота, воскресенье)" - это только в самом общем случае всегда только эти дни являются выходными.
|
|||
32
GenV
20.10.13
✎
23:45
|
(31) Не тупи. И в (0) и в (6) ясно написано что выкидывать только воскресенье. в (3) объяснили, что это не типовая конфа и производственного календаря нет. в (1) и поз же спросили про производственный календарь.
ЗЫ Но ты можешь решать свою задачу - я не против ) |
|||
33
mrDSide
21.10.13
✎
00:14
|
(32) вот именно, не тупи, там нигде не написано что не должно быть производственного календаря (писал я именно что надо добавить). ЧИТАЙ, ЧТО ЛЮДИ ПИШУТ.
|
|||
34
GenV
21.10.13
✎
00:26
|
(33) (33) Написано :))) "Выкидываем только субботу и воскресение". Про праздничные дни не слова. Или у тебя где-то обман зрения :)
|
|||
35
GenV
21.10.13
✎
00:35
|
43+ далее читаем обсуждение с моими высказываниями )
(24) Я календарь не нужен (26) "-введите количество "красных" дней календаря без учета обычных выходных." - Зачем?? "ВСЕ РАВНО К ЭТОМУ ПРИДЕТЕ." - Зачем, если как я и на писал он не нужен и к нему !точно не придем!, т.к. уже выложили решение без него??? (28) красные дни календаря и переносы как не крути учитывать надо. - Зачем ??? ЗЫ Т.ч. я то читать умею ) |
|||
36
mrDSide
21.10.13
✎
00:35
|
а как тебе это, умник: "возвращает количество дней в месяце без выходных (субботы, воскресенья)". Работаешь по праздникам? Когда рабочий день переносят учитывать не надо это?
|
|||
37
GenV
21.10.13
✎
00:36
|
(36) Нет, по условию задачи праздники не учитываются, умник )
|
|||
38
mrDSide
21.10.13
✎
00:37
|
(37) Любезный, объясните мне - лоху такому - что такое рабочие дни, если пишу ересь.
|
|||
39
GenV
21.10.13
✎
00:39
|
(38) Где ты увидел слова "рабочие дни"? Задача "количество дней в месяце без выходных (субботы, воскресенья)" и еще раз "Выкидываем только субботу и воскресение".
|
|||
40
mrDSide
21.10.13
✎
00:57
|
ну да с учетом (6) вполне достаточно
Дни=0;КонМ=КонецМесяца(НужнаяДата); Пока НужнаяДата<=КонМ Цикл Дни=Дни + ?(ДеньНедели(НужнаяДата)<6,1,0); НужнаяДата = НужнаяДата + 86400; КонецЦикла; Возврат Дни если запихнуть в гл.модуль, то в СКД можно использовать. А вот для запроса придется просто создавать таблицу, как и было написано выше, и передавать в параметры. |
|||
41
mrDSide
21.10.13
✎
00:58
|
(39) Просто смысла тогда нету в этом никакого, т.к. для реального учета это 100% не годиться.
|
|||
42
mrDSide
21.10.13
✎
01:00
|
(40) а еще лучше в параметры передавать возвращаемое значение функции с этим кодом. Тогда везде можно будет использовать))
|
|||
43
mrDSide
21.10.13
✎
01:01
|
(40) ну и дописать перед "Пока" следующее: "НужнаяДата=НачалоМесяца(НужнаяДата);"
=) |
|||
44
GenV
21.10.13
✎
01:01
|
(41) Скорее всего это тестовая задача на знание запросов, т.к. решать её полностью в запросе тоже нет особого смысла
|
|||
45
mrDSide
21.10.13
✎
01:18
|
(44) Так в том и дело, что язык предназначен для получения данных из таблиц (ну или любых др. коллекций).
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |